I have noticed that all of the Linq extension methods Where
, Any
, Take
etc. all return IEnumerable
. For my application it would be a lot nicer if these returned an instance of the same type as the one I am calling on.
例如,如果我打电话到myList.Where(......)
上LinkedList
,我将在上查阅<>LinkedList 。 i 类似于<代码>List。
当我有类似类型时,这种情况就更加令人痛心。
class MyType
{
public string MyField;
}
class MyCollection : List<MyType>
{
// Some useful stuff in here
}
in which case I would like to be able to do
MyCollection source = .......
MyCollection filtered = source.Where(obj => obj.MyField != null);
可悲的是,这从箱子中赢得了一定的工作。 然而,我已经接近尾声,使用了以下法典:
public static ListType Filtered<ListType, ElementType>(this ListType @this, Predicate<ElementType> filter) where ListType : class, ICollection<ElementType>, new()
{
// Arguments checks omitted
// Create return instance
var filtered = new ListType();
// Apply filter for each element
foreach (var item in @this)
{
if (filter(item))
filtered.Add(item);
}
return filtered;
}
我可以这样做(注意到名列首的代表)。
MyCollection source = .......
MyCollection filtered = source.Filtered((MyType obj) => obj.MyField != null);
因此,我的问题是:为什么我需要以下两个一般性论点:Filter<ListType, ElementType>
, 当我具体指明了 where ListType : ICollection<ElementType>
? 我的理解是,我无法在“的<>条/代码>中使用任何通用的类型,因为我在方法申报中添加了这种类型,但为何如此? 我是否忽略了这样做的恶果?