2013-07-01 3 views
5

मैं एक वस्तु है:लिंक के साथ सूची में वस्तु कैसे प्राप्त कर सकता हूं?

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

और मैं 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 
}); 

मैं कैसे Linq साथ collectionMyObject में ईद = 2 के साथ वस्तु मिल सकती है?

उत्तर

13

आप collectionMyObject में एक वस्तु जो आईडी 2 के साथ आइटम है खोजने की कोशिश कर रहे हैं, तो यह काम करना चाहिए:

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

और आईडी 2, तो इस प्रश्न के साथ एक आंतरिक आइटम खोजने की कोशिश करता है, तो आप कर रहे हैं SelectMany साथ उपयोगी हो सकता है:

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

उत्तर के लिए धन्यवाद! मैं थोड़ा सुधारित प्रश्न हूं और यह काम करता है कहां है (एस => एस। इटम्स! = नल)। चयन करें (ओ => ओ। इटम्स)। फर्स्टऑर्डडिफॉल्ट (io => io.Id == 2); – Alexandr

+0

@Alexandr, खाते में नल लेने के लिए उत्तर अपडेट किया गया। – Andrei

+0

ठीक है, धन्यवाद! :) – Alexandr

1

Where कीवर्ड और इतने की तरह एक लैम्ब्डा का उपयोग करना:

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

या, Items उप संग्रह में खोजने के लिए बस कार्य करें:

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

शायद 'फर्स्टऑर्डडिल्ट' अद्वितीय दिखाई देने के बाद बेहतर है। –

2

सरल:

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

संपादित करें: मैं हूँ सवाल खत्म हो गया है इसलिए आंद्रेई का जवाब मेरी तुलना में बेहतर दिखता है।

+0

उत्तर के लिए धन्यवाद! मैंने शायद गलत सवाल पूछा था कि मुझे दिमाग में था, आइटमों की खोज भी। – Alexandr

1

एक और तरीका हो सकता है:

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

इसे बदले में एक सूची देनी चाहिए। यदि एक एकल प्रविष्टि चाहते हैं, तो FirstOrDefault() के साथ प्रतिस्थापित करें।

उम्मीद है कि यह मदद करता है।

संबंधित मुद्दे

 संबंधित मुद्दे