LINQ

2013-03-07 8 views
6

とのIListに項目を探す私はIListを持っている:LINQ

IList list = CallMyMethodToGetIList(); 

私はLINQの何かでこのリストを検索したいと思います、私はそれを

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

を得ることができますタイプを知りませんlike:

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

ありがとうございます。

+5

タイプがわからない場合は、どのような状態になりますか? – Lee

+0

はvar itemFind = list.Where(i => myCondition(i))で始まります.... –

+2

汎用ではないIListを使用しているので、 '.OfType 'または '.Cast 'を追加する必要があります。 LINQメソッドを使用する前に。あなたのアイテムが同じタイプに属していない場合は、単に 'object'を' T'として使うことができます。 '.OfType ()' – digEmAll

答えて

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

+0

フィルターの例を示しました。タイプは –

+0

で、基本的に 'foreach(item)yield return(T)item'と' foreach(item)if(item is T)yield return item is T 'です。 – abatishchev

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

「動的」よりも効率的なソリューションがあります。 – abatishchev

+0

@abatishchev私はそれが非常に効率的ではないことに同意しますが、それは価値タイプをサポートします。 – Silvermind

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()'を使ったので、コンパイル時に型がわからないという印象を受けました。私は私の答えであなたのコメントに同意する '動的'非常に効率的ではないが、それはLinqをサポートしています。 – Silvermind