2013-02-22 50 views
5

मेरे पास एक सूची है जिसमें ऑब्जेक्ट्स हैं लेकिन इन objests सूची में अद्वितीय नहीं हैं। मैं एक और सूची में उन्हें अद्वितीय बनाने के लिए इस कोड को wrte:सूची। सामग्री ठीक से काम नहीं करती

foreach (CategoryProductsResult categoryProductsResult in categoryProductsResults.Where(categoryProductsResult => !resultSet.Contains(categoryProductsResult))) 
{ 
    resultSet.Add(categoryProductsResult); 
} 

लेकिन अंत ResultSet पर categoryProductsResults के साथ एक ही है।

categoryProductsResult की दूसरी पंक्ति:

enter image description here

ResultSet पहली पंक्ति:

enter image description here

आप देख सकते हैं ResultSet की पहली पंक्ति और categoryProductsResult की दूसरी पंक्ति में एक ही है, लेकिन यह दूसरी पंक्ति कहते हैं परिणाम के लिए।

क्या आपके पास कोई सुझाव है?

+1

हमें दिखाएं कि आप '.equals()' को ओवरराइड करते हैं। –

उत्तर

12

Contains डिफ़ॉल्ट तुलनाकर्ता का उपयोग करता है जो संदर्भों की तुलना कर रहा है क्योंकि आपकी कक्षा Equals और GetHashCode ओवरराइड नहीं करती है।

class CategoryProductsResult 
{ 
    public string Name { get; set; } 
    // ... 

    public override bool Equals(object obj) 
    { 
     if(obj == null)return false; 
     CategoryProductsResult other = obj as CategoryProductsResult; 
     if(other == null)return false; 
     return other.Name == this.Name; 
    } 

    public override int GetHashCode() 
    { 
     return Name.GetHashCode(); 
    } 
} 

अब आप बस का उपयोग कर सकते हैं:

resultSet = categoryProductsResults.Distinct().ToList(); 
+1

उत्कृष्ट कोड, बहुत बहुत धन्यवाद। – cagin

0

किसी सूची में संदर्भ वस्तुएं उनके हैश कोड द्वारा अनुक्रमित की जाती हैं। तो, Contains कभी नहीं एक ही हैश कोड के साथ एक संदर्भ वस्तु (जब तक आप कक्षा में GetHashCode और Equals कार्यान्वयन ओवरराइड मिल जाएगा।

यह SO answer बताते हैं।

3

सूची comparer EqualityComparer.Default और अनुसार द्वारा लौटाए का उपयोग करता है

डिफ़ॉल्ट संपत्ति जाँच करता है कि प्रकार टी System.IEquatable इंटरफ़ेस (टी के) को लागू करता है और, यदि हां, एक EqualityComparer (टी का) देता है कि का उपयोग करता है: उस के लिए प्रलेखन के लिए कार्यान्वयन। अन्यथा, यह एक EqualityComparer (टी का) Object.Equals और Object.GetHashCode की ओवरराइड टी द्वारा प्रदान का उपयोग करता है रिटर्न

तो आप अपने कस्टम वर्ग पर IEquatable को लागू कर सकते हैं, या इसके बराबर (ओवरराइड और GetHashCode) आपके द्वारा आवश्यक गुणों की तुलना करने के तरीके। वैकल्पिक रूप से आप linq का उपयोग कर सकते हैं:

बूल में = list.Any (i => i.Id == obj.Id);

0

यदि आपकी मौजूदा आइटम प्रत्येक यात्रा के लिए अपने लक्ष्य सूची में शामिल है की जाँच की जरूरत है। वर्तमान में आप लूप की शुरुआत में एक बार जांचते हैं, जिसका अर्थ है कि आपकी कोई भी वस्तु लक्ष्य सूची में नहीं है।

मुझे लगता है कि Distinct पहले से ही आप जो चाहते हैं वह कर रहे हैं, तो आप अपने स्वयं के लूप के बजाय इस एक्सटेंशन का उपयोग करना चाहेंगे।

1

प्रत्येक categoryProductsResult एक दूसरे के लिए अलग है। यह ऐसा कुछ है जो आप देख सकते हैं here।यदि आप एक सरल चाहते हैं और ProductId आपका अद्वितीय पहचानकर्ता है। बस नीचे दिए गए कोड को करें:

foreach (CategoryProductsResult categoryProductsResult in categoryProductsResults.Where(categoryProductsResult => resultSet.ProductId !=categoryProductsResult.ProductId) 
{ 
    resultSet.Add(categoryProductsResult); 
} 
संबंधित मुद्दे