2013-03-07 88 views
6

我有一个IList:在IList中查找项目与LINQ

IList list = CallMyMethodToGetIList(); 

,我不知道是什么类型,我可以得到它

Type entityType = list[0].GetType();` 

我想搜索这个名单与LINQ的东西如:

var itemFind = list.SingleOrDefault(MyCondition....); 

谢谢你的帮助。

+5

如果您不知道类型,您的情况如何? – Lee 2013-03-07 20:43:57

+0

var itemFind = list.Where(i => myCondition(i)).... – 2013-03-07 20:44:23

+2

由于您使用的是非通用'IList',因此您需要添加'.OfType '或'.Cast '在使用其他LINQ方法之前。如果你的项目不属于同一类型,你可以简单地使用'object'作为'T',即''.OfType ()' – digEmAll 2013-03-07 20:46:59

回答

18

简单:

IList list = MyIListMethod(); 

var item = list 
    .Cast<object>() 
    .SingleOrDefault(i => i is MyType); 

或:

IList list = MyIListMethod(); 

var item = list 
    .Cast<object>() 
    .SingleOrDefault(i => i != null); 

希望这有助于!

+3

'OfType ()'会为你做这个。 – abatishchev 2013-03-07 20:55:56

+0

我展示了一个过滤器的例子,不一定是 – 2013-03-07 20:58:26

+0

类型,基本上分别是'foreach(item)yield return(T)item'和'foreach(item)if if(item T)yield return item as T'。 – abatishchev 2013-03-07 21:00:44

0

由于JakobMöllås说你可以使用动态。至少它工作在LinqPad:

IList list = new List<string>(); 
list.Add("TEST"); 
list.Add("NOT"); 
Console.WriteLine(list.Cast<dynamic>().FirstOrDefault(l => l== "NOT")); 
+0

比'dynamic'更有效的解决方案。 – abatishchev 2013-03-07 20:52:53

+0

@abatishchev我同意它不是非常有效,但它支持值类型。 – Silvermind 2013-03-07 21:36:35

3
IList list = ... 

// if all items are of given type 
IEnumerable<YourType> seq = list.Cast<YourType>().Where(condition); 

// if only some of them  
IEnumerable<YourType> seq = list.OfType<YourType>().Where(condition); 
+0

由于他使用'list [0] .GetType()'来获取类型,所以我在编译时并不知道类型。我同意你在我的回答中的评论:“dynamic”效率不高,但它支持Linq。 – Silvermind 2013-03-07 21:32:52