2013-07-01 8 views
5

Ich habe ein Objekt:Wie kann ich Objekte in List mit Linq finden?

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

Und ich habe Liste von 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 
}); 

Wie finde ich Objekt mit der Id = 2 in collectionMyObject mit Linq?

Antwort

13

Wenn Sie versuchen, ein Objekt in collectionMyObject zu finden, das Element hat mit id 2, dann sollte diese Arbeit:

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

Und wenn Sie versuchen, sind ein inneres Element mit id 2, dann ist diese Abfrage zu finden mit SelectMany könnte hilfreich sein:

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

Danke für die Antwort! Ich bin eine kleine korrigierte Abfrage und es funktioniert Where (s => s.Items! = Null) .SelectMany (o => o.Items) .FirstOrDefault (io => io.Id == 2); – Alexandr

+0

@Alexandr, aktualisiert die Antwort Nullen zu berücksichtigen. – Andrei

+0

ok, danke! :) – Alexandr

1

Mit dem Where Schlüsselwort und eine Lambda etwa so:

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

Oder in der Items Unter Sammlung finden einfach tun:

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

Vielleicht ist 'FirstOrDefault' besser, da sie eindeutig erscheinen. –

2

Ganz einfach:

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

EDIT: Ich m Ich habe die Frage gelesen, so dass Andreis Antwort besser aussieht als meine.

+0

Danke für die Antwort! Ich habe wahrscheinlich die falsche Frage gestellt, die ich mir vorgestellt habe, die Suche nach Items. – Alexandr

1

Ein anderer Weg sein kann:

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

Es sollte eine Liste im Gegenzug geben. Wenn Sie einen einzelnen Eintrag wünschen, ersetzen Sie ToList() durch FirstOrDefault().

Ich hoffe, es hilft.