2010-07-13 12 views
7

मेरे पास एक ऑब्जेक्ट का प्रतिनिधित्व करने वाला एक साधारण वर्ग है। इसमें 5 गुण हैं (एक तिथि, 2 दशमलव, एक पूर्णांक और एक स्ट्रिंग)। मेरे पास संग्रह संग्रह वर्ग है, जो CollectionBase से लिया गया है, जो मेरी पहली कक्षा से कई ऑब्जेक्ट्स रखने के लिए एक कंटेनर क्लास है।LINQ का उपयोग कर संग्रह में डुप्लिकेट ऑब्जेक्ट्स को कैसे ढूंढें और हटाएं?

मेरा सवाल है, मैं डुप्लिकेट ऑब्जेक्ट्स को हटाना चाहता हूं (उदा। ऑब्जेक्ट्स जिनमें एक ही तारीख, समान दशमलव, समान पूर्णांक और एक ही स्ट्रिंग है)। क्या कोई LINQ क्वेरी है जिसे मैं डुप्लिकेट ढूंढने और निकालने के लिए लिख सकता हूं? या उन्हें कम से कम मिलते हैं?

उत्तर

10

आप Distinct ऑपरेटर का उपयोग करके डुप्लीकेट हटा सकते हैं।

दो ओवरलोड हैं - एक आपके प्रकार के लिए डिफ़ॉल्ट समानता तुलनाकर्ता का उपयोग करता है (जो एक कस्टम प्रकार के लिए Equals() प्रकार पर विधि को कॉल करेगा)। दूसरा आपको अपनी समानता तुलनाकर्ता की आपूर्ति करने की अनुमति देता है। वे दोनों नया अनुक्रम डुप्लीकेट के बिना आपके मूल सेट का प्रतिनिधित्व करते हैं। न तो अधिभार वास्तव में आपके प्रारंभिक संग्रह को संशोधित करता है - वे दोनों एक नया अनुक्रम लौटाते हैं जो डुप्लिकेट को छोड़ देता है।

तुम सिर्फ डुप्लीकेट ढूंढना चाहते हैं, तो आप ऐसा करने के लिए GroupBy उपयोग कर सकते हैं:

var groupsWithDups = list.GroupBy(x => new { A = x.A, B = x.B, ... }, x => x) 
         .Where(g => g.Count() > 1); 

एक IList<> की तरह कुछ से डुप्लीकेट निकालने के लिए आप कर सकता है:

yourList.RemoveAll(yourList.Except(yourList.Distinct())); 
+0

क्या यह उन्हें मेरे संग्रह से या केवल LINQ क्वेरी से हटा देगा? – Icemanind

+0

LINQ एक्सटेंशन विधियां आइटम के नए सेट बनाती हैं, आपका मूल संग्रह छूटे रहेंगे। –

+0

सभी जानकारी के लिए धन्यवाद! – Icemanind

4

यदि आपका सरल कक्षा Equals का उपयोग इस तरीके से करती है जो आपकी आवश्यकताओं को पूरा करती है तो आप अलग विधि

var col = ...; 
var noDupes = col.Distinct(); 
का उपयोग कर सकते हैं

यदि नहीं तो आपको IEqualityComparer<T> का एक उदाहरण प्रदान करने की आवश्यकता होगी जो आपकी इच्छानुसार मूल्यों की तुलना करता है। उदाहरण के लिए (शून्य समस्याओं संक्षिप्तता के लिए नजरअंदाज कर दिया)

public class MyTypeComparer : IEqualityComparer<MyType> { 
    public bool Equals(MyType left, MyType right) { 
    return left.Name == right.Name; 
    } 
    public int GetHashCode(MyType type) { 
    return 42; 
    } 
} 

var noDupes = col.Distinct(new MyTypeComparer()); 

नोट GetHashCode के लिए एक निरंतर के उपयोग जानबूझकर है। MyType के अर्थशास्त्र के बारे में अंतरंग विवरण जानने के बिना एक कुशल और सही हैशिंग फ़ंक्शन लिखना असंभव है। एक कुशल हैशिंग फ़ंक्शन के बदले मैंने स्थिरता का उपयोग किया जो कि प्रकार के अर्थशास्त्र के बावजूद सही है।

+0

क्या यह उन्हें मेरे संग्रह से हटा देगा हालांकि? या सिर्फ LINQ क्वेरी? – Icemanind

+0

@icemanind यह एक नया संग्रह लौटाएगा जिसमें कोई डुप्लीकेट नहीं है। यह जगह में एक संग्रह को संशोधित नहीं करेगा। – JaredPar

+1

उत्कृष्ट और सर्वोत्तम अभ्यास का जवाब – danielea

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