LINQ按对象类型选择

jak*_*aks 41 c# linq c#-3.0

我有一个包含两种对象A和B的集合.

Class Base{}
Class A : Base {}
Class B : Base {}

List<Base> collection = new List<Base>();
collection.Add(new A());
collection.Add(new B());
collection.Add(new A());
collection.Add(new A());
collection.Add(new B());
Run Code Online (Sandbox Code Playgroud)

现在我想根据集合的类型(A或B,而不是两者)选择集合中的对象.

我怎么能为此编写LINQ查询?请帮我.否则我需要遍历集合,这是我不想要的.谢谢.

编辑:

感谢大家的帮助.现在我可以使用LINQ中的OfType().但我认为在我的情况下它不会工作.我的情况是

Class Container
{
  List<Base> bases;
}

List<Container> containers = new List<Container>();
Run Code Online (Sandbox Code Playgroud)

现在我想从容器中选择容器,容器至少有一个类型A.可能这不能由LINQ完成.非常感谢.

Fre*_*örk 84

您可以使用OfTypeLinq方法:

var ofTypeA = collection.OfType<A>();
Run Code Online (Sandbox Code Playgroud)

关于你不愿意循环收集,你应该记住,Linq不做魔术; 我没有检查执行情况OfType,但我会感到很惊讶没有找到一个循环或迭代器在那里.

  • @Jai:您应该标记您认为最有用或最有帮助的答案.Jared和Fredrik都是正确的,但Fredrik的回答更深入,可能会帮助您了解更多信息. (2认同)

Jar*_*Par 12

您可以使用OfType扩展方法

IEnumerable<A> filteredToA = list.OfType<A>();
IEnumerable<B> filteredToB = list.OfType<B>();
Run Code Online (Sandbox Code Playgroud)


Dre*_*kes 12

为了完整性,这里是源代码Enumerable.OfType<T>.

public static IEnumerable<TResult> OfType<TResult>(this IEnumerable source) {
    if (source == null) throw Error.ArgumentNull("source"); 
    return OfTypeIterator<TResult>(source); 
}

static IEnumerable<TResult> OfTypeIterator<TResult>(IEnumerable source) {
    foreach (object obj in source) {
        if (obj is TResult) yield return (TResult)obj;
    } 
}
Run Code Online (Sandbox Code Playgroud)

您可以看到它懒惰地评估源流.