在C#/ Linq中搜索集合中的子类型

时间:2010-06-29 09:55:41

标签: c# linq polymorphism

如果我有像

这样的集合
List<SomeAbstractBaseType> someList = new List<SomeAbstractBaseType>();

我已经为这个集合添加了两个不同的子类型(即两个子类型继承自SomeAbstractBaseType),如下所示:

someList.Add(someChildOfType1);
someList.Add(someChildOfType2);
someList.Add(someOtherChildOfType1);
someList.Add(someOtherChildOfType2);

假设我想查询someChildOfType1的所有元素。我怎么能这样做我尝试了以下(不编译,可以从子类型转换为父类型)

List<ChildType1> temp = someList.Where(x => x.GetType() == typeof(ChildType1)).ToList();

我有什么想法可以做到这一点?

3 个答案:

答案 0 :(得分:4)

List<ChildType1> temp = someList.OfType<ChildType1>().ToList();

答案 1 :(得分:0)

Enumerable.OfType<T>()扩展方法。

答案 2 :(得分:0)

Enumerable.OfType<T>()仅适用于.NET 3.5及更高版本,因此您需要一个可在.NET 3.0中运行的解决方案

问题在于,即使您找到了所有子类型,列表仍然是基本类型。构建子类型列表的一种方法是使用ConvertAll来转换您知道的类型正确的对象:

List<ChildType1> temp = someList.FindAll(x => x is ChildType1).ConvertAll(x => (ChildType1) x);