2011-11-29 36 views
18

तो मैं समझता हूं कि लिंक से Distinct() का उपयोग करके तारों और int आदि की सूची में डुप्लिकेट को कैसे हटाया जाए। लेकिन आप ऑब्जेक्ट की विशिष्ट विशेषता के आधार पर डुप्लीकेट कैसे हटाते हैं?सूची में डुप्लिकेट ऑब्जेक्ट्स को हटा रहा है (सी #)

उदाहरण के लिए, मेरे पास TimeMetric कक्षा है। यह TimeMetric कक्षा में दो विशेषताएं हैं: MetricText और MetricTime। मेरे पास TimeMetrics की एक सूची है जिसे MetricList कहा जाता है। मैं को MetricText विशेषता के साथ किसी भी डुप्लिकेट को हटाना चाहता हूं। TimeMetric मान समान हो सकता है लेकिन यदि कोई TimeMetric समान MetricText है, तो इसे अपूर्ण किया जाना चाहिए।

उत्तर

21

आपको Distinct के दूसरे अधिभार का उपयोग करने की आवश्यकता है जो एक दूसरे पैरामीटर के रूप में IEqualityComparer<TimeMetric> उदाहरण लेता है। इस तरह की एक comparer परिभाषित करें:

class MyComparer : IEqualityComparer<TimeMetric> 
{ 
    public bool Equals(TimeMetric x, TimeMetric y) 
    { 
     return x.MetricText.Equals(y.MetricText); 
    } 

    public int GetHashCode(TimeMetric obj) 
    { 
     return obj.MetricText.GetHashCode(); 
    } 
} 

महत्वपूर्ण नोट: ऊपर कोड मामले की जांच नहीं करता जहां MetricText संपत्ति null है (और यह लग रहा है जैसे कि यह हो सकता है, क्योंकि यह सबसे शायद एक string है)। null से 0 से आपको 0 वापस करना चाहिए। दूसरी तरफ, यदि MetricText का प्रकार एक मान प्रकार है, तो आपको कोई संशोधन करने की आवश्यकता नहीं है।

और फिर:

var list = new List<TimeMetric> { ... }; 
var unique = list.Distinct(new MyComparer()); 
3

आप एक IEqualityComparer साथ Distinct overload उपयोग कर सकते हैं। अपने IEqualityComparer कार्यान्वयन के लिए

आपका बराबरी विधि इस प्रकार दिखाई देगा:

bool Equals(TimeMetric x, TimeMetric y) 
{ 
    return x.MetricText.Equals(y.MetricText); 
} 
+1

यह सही नहीं है और केवल तभी काम करेगा जब 'मेट्रिकटेक्स्ट' प्रकार 'स्ट्रिंग' (या कोई अन्य प्रकार जो 'ऑपरेटर ओवरराइड करता है == ')। इसके बजाए 'बराबर' का उपयोग किया जाना चाहिए। – Jon

+0

मुझे लगता है कि यह एक स्ट्रिंग था, जो एक अच्छी धारणा नहीं थी, और प्रतिक्रिया को अद्यतन किया। –

14

उपयोग LINQ:

var list = list 
    .GroupBy(i => i.MetricText) 
    .Select(g => g.First()) 
    .ToList(); 

या एक comparer संपत्ति का उपयोग करता है में पारित:

public class mtCompare : IEqualityComparer<TimeMetric> 
{ 
    public bool Equals(TimeMetric x, TimeMetric y) 
    { 
    return Equals(x.MetricText, y.MetricText); 
    } 

    public int GetHashCode(TimeMetric obj) 
    { 
    return obj.MetricText.GetHashCode(); 
    } 
} 

.... 

list.Distinct(new mtCompare()); 
संबंधित मुद्दे