2013-05-29 6 views
10

सूची 1 में आइटम {ए, बी} और सूची 2 में आइटम {ए, बी, सी} शामिल हैं।लिंक के अलावा काम नहीं कर रहा है क्योंकि मैंने सोचा था

जब मुझे लिंक एक्सटेंशन का उपयोग करना है तो मुझे वापस लौटने की आवश्यकता है {सी}। इसके बजाय मैं वापस लौटाता हूं {ए, बी} और यदि मैं अपनी अभिव्यक्ति में सूचियों को फ्लिप करता हूं तो परिणाम {ए, बी, सी} होता है।

क्या मैं छोड़कर बिंदु को गलत समझ रहा हूं? क्या कोई और विस्तार है जिसका उपयोग मैं नहीं देख रहा हूं?

मैंने इस मामले पर कई अलग-अलग पदों को देखा है और इस तरह से कोई सफलता नहीं मिली है।

var except = List1.Except(List2); //This is the line I have thus far

संपादित करें: हाँ मैं साधारण वस्तुओं की तुलना की गई थी। मैंने कभी भी IEqualityComparer का उपयोग नहीं किया है, यह सीखना दिलचस्प था।

सहायता के लिए सभी धन्यवाद। समस्या तुलनात्मक को लागू नहीं कर रही थी। जहां लिंक किया गया ब्लॉग पोस्ट और उदाहरण नीचे उपयोगी है।

+1

उन सूचियों में वास्तव में क्या है? –

+0

आपके आइटम का डेटा प्रकार क्या है। क्या यह एक वर्ग है? यह लिंक आपकी मदद कर सकता है http://stackoverflow.com/questions/1645891/why-isnt-except-linq-comparing-things-properly-using-iequatable – arunlalam

+0

वे इस समय के लिए कुछ गुणों के साथ सरल वस्तुएं हैं। मैं आपके लिंक को देख लूंगा। – Schanckopotamus

उत्तर

10

यदि आप अपनी सूची में संदर्भ प्रकार संग्रहीत कर रहे हैं, तो आपको यह सुनिश्चित करना होगा कि समानता के लिए वस्तुओं की तुलना करने का कोई तरीका है। अन्यथा यदि वे एक ही पते का संदर्भ लेते हैं तो उनकी तुलना करके उनकी जांच की जाएगी।

आप IEqualityComparer<T> लागू कर सकते हैं और इसे Except() फ़ंक्शन पर पैरामीटर के रूप में भेज सकते हैं। यहां एक blog post है जो आपको उपयोगी मिल सकता है।

+0

यह स्पष्ट करने के लिए यह समाधान है जो मेरी समस्या को हल करता है और आपके परिदृश्य के आधार पर एक व्यवहार्य विकल्प है। – Schanckopotamus

6

आपने बस तर्कों के आदेश को भ्रमित कर दिया। मैं देख सकता हूँ जहाँ इस भ्रम पैदा हुई, क्योंकि official documentation के रूप में उपयोगी नहीं है के रूप में यह हो सकता है:

मूल्यों की तुलना करने के लिए डिफ़ॉल्ट समानता comparer का उपयोग करके दो दृश्यों के सेट अंतर उत्पन्न करता है।

जब तक आप सेट सिद्धांत में निपुण रहे हैं, यह स्पष्ट है कि एक set difference वास्तव में — है यह बस क्या सेट के बीच अलग है नहीं है नहीं हो सकता। हकीकत में, Except पहले सेट में तत्वों की सूची देता है जो दूसरे सेट में नहीं हैं।

var except = List2.Except(List1); // { C } 
+0

यदि सूची आदेश बदलता है तो मुझे {ए, बी, सी} – Schanckopotamus

4
तो बस संपूर्णता के लिए

...

// Except gives you the items in the first set but not the second 
    var InList1ButNotList2 = List1.Except(List2); 
    var InList2ButNotList1 = List2.Except(List1); 
// Intersect gives you the items that are common to both lists  
    var InBothLists = List1.Intersect(List2); 

संपादित करें::

इस प्रयास करें के बाद से अपनी सूची की वस्तुओं को शामिल आप अपने वर्ग के लिए एक IEqualityComparer में पारित करने के लिए की जरूरत है ... यहाँ यह है कि आपके सिवाय इसके कि एक नमूना IEqualityComparer के साथ बनाए गए ऑब्जेक्ट्स के आधार पर दिखाई देगा ... :)

// Except gives you the items in the first set but not the second 
     var equalityComparer = new MyClassEqualityComparer(); 
     var InList1ButNotList2 = List1.Except(List2, equalityComparer); 
     var InList2ButNotList1 = List2.Except(List1, equalityComparer); 
// Intersect gives you the items that are common to both lists  
     var InBothLists = List1.Intersect(List2); 

public class MyClass 
{ 
    public int i; 
    public int j; 
} 

class MyClassEqualityComparer : IEqualityComparer<MyClass> 
{ 
    public bool Equals(MyClass x, MyClass y) 
    { 
     return x.i == y.i && 
       x.j == y.j; 
    } 

    public int GetHashCode(MyClass obj) 
    { 
     unchecked 
     { 
      if (obj == null) 
       return 0; 
      int hashCode = obj.i.GetHashCode(); 
      hashCode = (hashCode * 397)^obj.i.GetHashCode(); 
      return hashCode; 
     } 
    } 
} 
+0

मिलता है InList1ButNotList2 {सी, बी, ए} देता है, जो हो रहा है। – Schanckopotamus

+0

@Schanckopotomus Ahh ... आपकी सूचियां ऑब्जेक्ट्स हैं और उनकी गुण बराबर हैं लेकिन ऑब्जेक्ट्स बराबर सही नहीं हैं? – Kevin

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