2013-07-01 9 views
5

Bir nesne var:Listede Linq ile nesneyi nasıl bulabilirim?

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

Ve MyObject listesi var:

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 
}); 

nasıl Linq ile collectionMyObject içinde Id = 2 ile nesne bulabilirim? Where anahtar kelime ve şöyle bir lambda kullanarak

cevap

13

Şu kimliğe 2 ile öğenin yer aldığı collectionMyObject bir nesneyi bulmaya çalışıyorsanız, o zaman bu çalışması gerekir SelectMany ile yararlı olabilir:

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

Cevabınız için teşekkürler! Ben biraz düzeltilmiş bir sorgu yaşıyorum ve çalışır (s => s.Items! = Null) .SelectMany (o => o.Items) .FirstOrDefault (io => io.Id == 2); – Alexandr

+0

@Alexandr, null değerlerini dikkate almak için cevabı güncelledi. – Andrei

+0

tamam, teşekkürler! :) – Alexandr

1

: Items alt koleksiyonunda bulmak için

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

Veya basitçe yapın: Basit

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

Belki de 'FirstOrDefault' benzersiz göründüğünden daha iyidir. –

2

:

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

DÜZENLEME: Ben m Andrei'nin cevabı benimkinden daha iyi görünüyor diye soruyu soruyor.

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

Ve eğer id 2, sonra bu sorgu sahip bir iç öğeyi bulmak için deneyin:

+0

Cevabınız için teşekkürler! Muhtemelen aklımdaki yanlış soruyu sordum, Öğeler için de arama. – Alexandr

1

bir başka yolu olabilir:

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

Bu, karşılığında bir liste vermelidir. Tek bir giriş istiyorsanız, ToList()'u FirstOrDefault() ile değiştirin.

Yardım edin.