2011-06-12 12 views
5

से सूची प्राप्त करने मैं दो संग्रह हैं: एक आइटम है और एक अन्य है ActiveItemsLinq एक और सूची

इन दो संग्रह के बीच केवल चौराहे का नाम

है मैं आइटम जहां आइटम से Linq के साथ एक सूची चाहते हैं

Items.Where(i => ActiveItems.Count(v=> v.Name==i.Name) > 0) 

उत्तर

11

मैं शायद का एक सेट बनाना होगा: नाम

मैं इस कोड लिखा था वहाँ एक बेहतर विचार है कि नाम के साथ ActiveItems में हैं ActiveItems से नाम और फिर उपयोग करते हैं:

var activeNames = new HashSet<string>(activeItems.Select(x => x.Name)); 
var itemsWithActiveNames = items.Where(x => activeNames.Contains(x.Name)) 
           .ToList(); 

एक अन्य विकल्प में शामिल होने, उदा उपयोग करने के लिए है

var query = from activeItem in activeItems 
      join item in items on activeItem.Name equals item.Name 
      select item; 

ध्यान दें कि यह नकली item मूल्यों अगर वहाँ एक ही नाम के साथ कई ActiveItem मान हैं दे देंगे: एक प्रश्न अभिव्यक्ति के साथ। एक अन्य विकल्प में शामिल होने, जो इस समस्या नहीं है लेकिन थोड़ा clumsier है:

var query = from item in items 
      join activeItem in activeItems 
       on item.Name equals activeItem.Name 
       into g 
      where g.Any() 
      select item; 

ध्यान दें कि इन सब हे (एन * एम) से बचने जाएगा नामों के लिए जाँच - पीछे वे हूँ सभी उपयोग हैश तालिकाओं ओ (एन + एम) जटिलता देने के लिए दृश्य।

+0

नहीं मैं नहीं चाहता कि गुण एक और संग्रह –

+0

से चाहते हैं मुझे लगता है कि अपने पहले जवाब सबसे अच्छा धन्यवाद है एक बहुत +1 –

+0

होगा समाधान 2 और 3 'सक्रिय नाम' के बिना आंतरिक रूप से हैशसेट का उपयोग करें? – Magnus

0
var results = from i1 in collection1.Items 
       join i2 in collection2.ActiveItems on i1.Name equals i2.Name 
       select i2.Name; 
0

का उपयोग करना एक में शामिल होने:

from item in Items 
join active in ActiveItems on item.Name equals active.Name 
select item 
+0

शामिल होना चाहिए ... आइटम पर। नाम सक्रिय है। नाम। अनुक्रम महत्वपूर्ण है – slfan

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