使用Linq查找所有特定类型的内容

44

有没有一种方法可以使用Linq / Lambda表达式在列表中查找所有特定类型的项目?

更新:由于答案,我意识到问题不够具体。 我需要一个只包含特定类型项的新列表。 在我的情况下,该类没有任何子类,因此不需要考虑继承。


你能否说明是否想要忽略继承关系?例如,如果您想要所有 Object 类型,您是只想要 Object 类型还是包括 Object 的所有子类。一些答案将选择前者,其他人则会选择后者。 - Alex Humphrey
我看到,在我的情况下,这个类没有任何子类。 - Lieven Cardoen
5个回答

119
使用OfType<T>的方式如下:
foreach (var bar in MyList.OfType<Foo>()) {
    ...
}

4
使用 IEnumerable<T> 扩展方法 OfType<T> 是微软推荐的做法。 - devlife

39
这可以吗?
list.Where(t => t is MyType);

18
如果您使用OfType,那么仍然需要进行类型转换,因为OfType返回的结果也会被转换。 - Edwin Stoteler
1
太好了!我有一个情况,其中两个类继承相同的抽象类但不同的接口。OfType<>方法强制转换列表,而使用“is”方法正好做到了我想要的效果。谢谢! - Stu1986C

0
也许你可以使用...
        List<object> list = new List<object>();
        list.Add("string");
        list.Add(9);

        var allOfOneType = list.Where(i => i.GetType().Equals(typeof(string)));

是的... Dave Markles 的回答可能更好 - 或许 :) - hnkz

0

如果使用Linq to objects,可以这样写(但是在Linq to entities中不起作用):

var specificListOfTypes = from item in list
                            where item.GetType() == typeof(int)
                            select item;

2
你不能使用GetType()方法。它会抛出以下错误:"LINQ to Entities不识别'System.Type GetType()'方法,该方法无法转换为存储表达式。" - spadelives
1
好的,所以在LINQ to Entities中无法使用GetType(),但是在LINQ to objects中可以工作。 - Dave Arkell

-4

您可以使用GetType()方法并与指定类型进行比较。

例如,我从下面的列表中选择所有字符串类型的值:

   var myList = new List<object>();

        myList.Add(5);

        myList.Add("My life");

        var result = from obj in myList
                     where obj.GetType() == typeof(string)
                     select obj;

2
这会抛出一个错误:“LINQ to Entities 不认识方法 'System.Type GetType()',并且这个方法不能被转化为存储表达式。” - spadelives

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接