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,我更喜欢这样;)

LINQ for System.Collections.IEnumerable

因为大多数这些方法都是通用的,当您只获得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操作符将给定类型的非泛型集合中的这些项创建为泛型集合。因此,它允许您引入强类型并在行后面使用类型化操作符。