2010-03-04 14 views
40

यदि मेरे पास एक आईनेमरेबल है जहां क्लासए टाइप प्रकार की आईडी प्रॉपर्टी का खुलासा करता है। क्या क्लास के सभी उदाहरणों को दूसरी आईनेमरेबल से संबंधित आईडी के लिए एक लिंक क्वेरी का उपयोग करना संभव है?इंटरसेक्ट LINQ क्वेरी

दूसरे शब्दों में, क्या यह किया जा सकता है?

IEnumerable<ClassA> = original.Intersect(idsToFind....)? 

जहां मूल एक IEnumerable<ClassA> है और idsToFind IEnumerable<long> है।

उत्तर

50

हाँ का लाभ लेता है कर सकते हैं।

जैसा कि अन्य लोगों ने उत्तर दिया है, आप Where का उपयोग कर सकते हैं, लेकिन यह बड़े सेट के लिए बेहद अक्षम होगा।

यदि प्रदर्शन चिंता का विषय है, तो आप Join कॉल कर सकते हैं: डुप्लीकेट शामिल कर सकते हैं

var results = original.Join(idsToFind, o => o.Id, id => id, (o, id) => o); 

हैं idsToFind, आप (या तो आईडी पर या परिणामों पर Distinct() फोन या GroupJoin साथ Join बदलना भी होगा GroupJoin के पैरामीटर समान होंगे)।

+0

यह मैं के लिए क्या देख रहा था है, धन्यवाद। किसी भी तरह, यह इसे मेरे मूल quesion में नहीं बनाया है, लेकिन idsToFind = IEnumerable । फिर से धन्यवाद। –

+1

कोई भी विचार जिस पर 'मूल' या 'idsToFind'' आकार 'का आकार' कहां '/' युक्त 'समाधान से अधिक कुशल हो रहा है? मैं कल्पना कर सकता हूं कि छोटी सूचियों (शायद 20-30 आइटम) के लिए 'जॉइन' में बहुत अधिक ओवरहेड है? – Tobias

1

परिणामों को फ़िल्टर करने Where विधि का उपयोग करें:

var result = original.Where(o => idsToFind.Contains(o.ID)); 
5

एक आसान तरीका होगा:

IEnumerable<ClassA> result = original.Where(a => idsToFind.contains(a.ID)); 
9

तुम कर सकते हो, लेकिन मौजूदा रूप में, आप का उपयोग करना चाहें Where विस्तार विधि।

var results = original.Where(x => yourEnumerable.Contains(x.ID)); 

दूसरी ओर Intersect तत्वों है कि दोनों IEnumerable की में कर रहे हैं। आप देख रहे हैं सिर्फ पहचान पत्र की सूची के लिए, आप जिसके बाद Intersect

var ids = original.Select(x => x.ID).Intersect(yourEnumerable); 
13

मैं Intersect का उपयोग कर उत्तर पोस्ट करूंगा।

यह उपयोगी है यदि आप एक ही प्रकार के 2 IEnumerables को छेड़छाड़ करना चाहते हैं।

पहले हम एक EqualityComparer की आवश्यकता होगी:

public class KeyEqualityComparer<T> : IEqualityComparer<T> 
    { 
     private readonly Func<T, object> keyExtractor; 

     public KeyEqualityComparer(Func<T, object> keyExtractor) 
     { 
      this.keyExtractor = keyExtractor; 
     } 

     public bool Equals(T x, T y) 
     { 
      return this.keyExtractor(x).Equals(this.keyExtractor(y)); 
     } 

     public int GetHashCode(T obj) 
     { 
      return this.keyExtractor(obj).GetHashCode(); 
     } 
    } 

दूसरी बात हम Intersect कार्य करने के लिए KeyEqualityComparer लागू होते हैं:

var list3= list1.Intersect(list2, new KeyEqualityComparer<ClassToCompare>(s => s.Id));