LINQ for System.Collections.IEnumerable
本文关键字:IEnumerable Collections System for LINQ | 更新日期: 2023-09-27 18:05:42
LINQ Where()
与System.Collections.Generic.IEnumerable<T>
一起工作,但如果实现的接口是System.Collections.IEnumerable
,则不能使用
我的问题是,为什么会这样?
更新:也许有一点背景,我想在Unity的Transform
类上使用.Where()
,它实现了System.Collections.IEnumerable
而不是System.Collections.Generic.IEnumerable<Transform>
,即使它只有Transforms
作为孩子。所以我现在为Transform
创建了一个扩展方法,请随意使用:
/// <summary> Where-Filter implementation for transform to filter out specific children</summary>
public static IEnumerable<GameObject> WhereChild(this Transform s, Func<GameObject, bool> callback) {
List<GameObject> r = new List<GameObject>();
foreach (Transform cur in s) { if (callback(cur.gameObject)) { r.Add(cur.gameObject); } }
return r;
}
(修改它,如果你想工作的转换,而不是孩子的Gameobjects,我更喜欢这样;)
因为大多数这些方法都是通用的,当您只获得object
s时几乎没有意义。有几个方法实际上是在IEnumerable
而不是IEnumerable<T>
上声明为扩展方法的,例如Cast<T>()
和OfType<T>
,它们都返回一个类型化的可枚举对象。
因此,在您的情况下,您可以使用Cast<object>()
以最无用的方式获得LINQ的好处,因为Where
的谓词不能真正合理地使用object
而不强制转换它。
非泛型集合,你不能真正说任何关于项目,他们只是object
s不会让你写有用的谓词。这些是linq操作符所要求的。
假设
IEnumerable e = ...;
e.Where( item => ?? );
这里item
的类型是object
,你几乎卡住了。
另一方面
IEnumerable<Person> e = ...;
e.Where( item => ?? );
这里可以引用实际类型包含的任何成员。
注意你总是可以"上cast"集合
IEnumerable e = ...;
e.OfType<Person>().Where( ... )
OfType
操作符将给定类型的非泛型集合中的这些项创建为泛型集合。因此,它允许您引入强类型并在行后面使用类型化操作符。