2013-07-01 18 views
5

Mam obiektu:Jak znaleźć obiekt na liście za pomocą Linq?

public class MyObject 
    { 
     public int Id { get; set; }  
     public List<MyObject> Items { get; set; }  
    } 

I mam listy MyObject:

List<MyObject> collection = new List<MyObject>(); 

collection.Add(new MyObject() 
{ 
    Id = 1, 
    Items = null 
}); 

collection.Add(new MyObject() 
{ 
    Id = 2, 
    Items = null 
}); 

collection.Add(new MyObject() 
{ 
    Id = 3, 
    Items = null 
}); 


List<MyObject> collectionMyObject = new List<MyObject>(); 

collectionMyObject.Add(new MyObject() 
{ 
    Id = 4, 
    Items = collection 
}); 

collectionMyObject.Add(new MyObject() 
{ 
    Id = 5, 
    Items = null 
}); 

Jak mogę znaleźć obiekt o id = 2 w collectionMyObject z Linq?

Odpowiedz

13

Jeśli próbujesz znaleźć obiekt w collectionMyObject który ma element o identyfikatorze 2, to powinno działać:

MyObject myObject = collectionMyObject.FirstOrDefault(o => o.Items != null && o.Items.Any(io => io.Id == 2)); 

A jeśli jesteś spróbować znaleźć wewnętrzny element o identyfikatorze 2, następnie tego zapytania z SelectMany może być pomocne:

MyObject myObject1 = collectionMyObject.Where(o => o.Items != null).SelectMany(o => o.Items).FirstOrDefault(io => io.Id == 2); 
+1

Dzięki za odpowiedź! Jestem trochę poprawione zapytanie i działa Where (s => s.Items! = Null). SelectMany (o => o.Items) .FirstOrDefault (io => io.Id == 2); – Alexandr

+0

@Alexandr, zaktualizował odpowiedź, aby uwzględnić wartości null. – Andrei

+0

ok, dziękuję! :) – Alexandr

1

Używanie Where słowa kluczowego i lambda tak:

MyObject result = collectionMyObject.Where(x => x.Id == 2).FirstOrDefault() 

lub, aby znaleźć się w Items sub-kolekcji po prostu zrobić:

MyObject result = collectionMyObject.Where(x => x.Item.Id == 2).FirstOrDefault() 
+3

Być może "FirstOrDefault" jest lepszy, ponieważ wydaje się wyjątkowy. –

2

Proste:

var obj = collectionMyObject.FirstOrDefault(o => o.Id == 2); 
8
var item = collectionMyObject.FirstOrDefault(x => x.Id == 2); 

EDYCJA: Jestem Jest to pytanie, więc odpowiedź Andrei wygląda lepiej niż moja.

+0

Dzięki za odpowiedź! Prawdopodobnie zadałem niewłaściwe pytanie, które miałem na myśli, poszukiwanie przedmiotów również. – Alexandr

1

Innym sposobem może być:

(from c in collection where c.Id == 2 select c).ToList;

Powinien w zamian podać listę. Jeśli chcesz pojedynczego wpisu, zastąp ToList() przez .

Mam nadzieję, że to pomaga.

Powiązane problemy