2010-07-13 63 views
23

有没有办法在列表中找到具有Linq/Lambda表达式的某种类型的所有项目?Linq找到所有具有某种类型的东西

更新:由于答案,我意识到这个问题不够具体。我只需要一个具有特定类型项目的新列表。就我而言,这个类没有任何子类,所以不需要考虑继承。

+0

你能说出您是否想忽略继承?例如。如果你想要所有的对象类型,你想只是对象类型还是包含对象的所有子类。一些答案会做第一个,其他答案会做第一个。 – 2010-07-13 11:12:55

+0

我看到,在我的情况下,这个类没有任何子类。 – 2010-07-13 11:14:46

回答

73

使用OfType<T>像这样:

foreach (var bar in MyList.OfType<Foo>()) { 
    ... 
} 
+3

使用IEnumerable 扩展方法OfType 是微软推荐的方法。 – devlife 2010-07-13 11:58:05

29

请问这个怎么办?

list.Where(t => t is MyType); 
+2

+1阅读好得多,其他方式 – GFoley83 2013-07-12 05:57:36

+0

是的,看起来更容易阅读。 +1 – 2014-06-27 10:54:09

+5

但是你仍然必须施放结果,如果你使用OfType,结果也会被铸造出来。 – 2016-02-24 14:05:35

0

,也许你可以使用...

 List<object> list = new List<object>(); 
     list.Add("string"); 
     list.Add(9); 

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

是啊...戴夫马克斯答案更好 - 也许:) – hnkz 2010-07-13 11:04:52

1

像这样的东西(如果使用LINQ to对象 - 它不会使用LINQ工作单位):

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

你不能使用GetType()。它会抛出以下错误:“LINQ to Entities不能识别方法'System.Type GetType()'方法,并且此方法不能转换为存储表达式。” – spadelives 2013-06-19 02:25:11

+0

好吧,所以你不能在LINQ to Entities中使用GetType(),但是LINQ to objects does not work – 2013-08-22 09:19:50

-1

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

举例来说,我选择string类型的所有值从以下列表:

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; 
+1

这会引发一个错误,“LINQ to Entities does not recognized the method'System.Type GetType()'method,this this方法不能转换成商店表达式。“ – spadelives 2013-06-19 02:24:31

-1

我建议使用此 var myLst = new List<object>(); var elements = myList.Where(item => item.GetType().IsInstanceOfType(typeof(MyClass)));

相关问题