2013-03-07 15 views
6

Mam IList:Znajdź element w IList z LINQ

IList list = CallMyMethodToGetIList(); 

że nie wiem typ mogę je

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

Chciałbym poszukać tej listy z LINQ coś na przykład:

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

Dziękuję za pomoc.

+5

Jak wygląda twój stan, jeśli nie znasz typu? – Lee

+0

zacznij od var itemFind = list.Where (i => myCondition (i)) .... –

+2

Ponieważ używasz nietypowego 'IList', musisz dodać' .OfType 'lub' .Cast ' przed użyciem innych metod LINQ. Jeśli twoje produkty nie należą do tego samego typu, możesz po prostu użyć 'object' jako' T' ie '.OfType ()' – digEmAll

Odpowiedz

18

Proste:

IList list = MyIListMethod(); 

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

czyli

IList list = MyIListMethod(); 

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

nadzieja ta pomoc!

+3

'OfType ()' zrobi to za Ciebie. – abatishchev

+0

Pokazałem przykład filtra, niekoniecznie typu –

+0

w zasadzie są to: foreach (item) return return (T) item' oraz 'foreach (item) if (item is T) yield return item jako T' odpowiednio. – abatishchev

0

Jak Jakob Möllås mówi, że można użyć dynamicznego. Przynajmniej to działa w LINQPad:

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

Istnieją bardziej wydajne rozwiązania niż "dynamiczne". – abatishchev

+0

@abatishchev Zgadzam się, że nie jest bardzo wydajny, jednak obsługuje typy wartości. – 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

Miałem wrażenie, że typ nie był znany podczas kompilacji, ponieważ użył 'list [0] .GetType()', aby uzyskać typ. Zgadzam się z twoim komentarzem na mojej odpowiedzi, że 'dynamic' nie jest bardzo wydajny, ale obsługuje Linq. – Silvermind