2013-07-18 2 views
5

निश्चित रूप से वहाँ एक आसान तरीका मूल्यों का एक संग्रह सत्यापित करने के लिए है कोई डुप्लिकेट है (कोई डुप्लिकेट शामिल हैं) [के डिफ़ॉल्ट Comparison का उपयोग कर collection के Type] सी # में/.NET? सीधे निर्मित नहीं होना चाहिए लेकिन कम और कुशल होना चाहिए।मैं कैसे सत्यापित करूं मूल्यों का एक संग्रह अनूठा है सी # में

मैंने बहुत कुछ देखा है लेकिन मैं collection.Count() == collection.Distinct().Count() का उपयोग करने के उदाहरणों को मारता रहता हूं जो मेरे लिए अक्षम है। मुझे नतीजे में दिलचस्पी नहीं है और जैसे ही मैं डुप्लिकेट का पता लगाता हूं, उसे जमानत देना चाहता हूं, क्या यह मामला होना चाहिए।

+2

तुलनात्मक के बिना 'विशिष्ट()' का उपयोग * * * प्रकार की डिफ़ॉल्ट तुलना का उपयोग करता है। यह स्पष्ट नहीं है कि आप 'डिस्टिंट()' का उपयोग कर समाधान के बारे में क्या नापसंद करते हैं ... –

+0

@ जोनस्केट अपडेटेड क्यू इसके साथ मेरी समस्या का संकेत देने के लिए (मुझे परिणाम नहीं चाहिए और तुरंत बंद करना चाहते हैं)। (यह एक साधारण गार्ड) –

+1

सही, यह एक बहुत अलग सवाल है। –

उत्तर

9

ठीक है, यदि आप बस के रूप में जल्द ही के रूप डुप्लिकेट पाया जाता है बाहर निकलना चाहता हूँ, यह आसान है:

// TODO: add an overload taking an IEqualityComparer<T> 
public bool AllUnique<T>(this IEnumerable<T> source) 
{ 
    if (source == null) 
    { 
     throw new ArgumentNullException("source"); 
    } 
    var distinctItems = new HashSet<T>(); 
    foreach (var item in source) 
    { 
     if (!distinctItems.Add(item)) 
     { 
      return false; 
     } 
    } 
    return true; 
} 

... या All का उपयोग करें, जैसा कि आप पहले ही दिखा चुके हैं। मैं तर्क दूंगा कि इस मामले में यह समझना थोड़ा आसान है ... या यदि आप All का उपयोग करना चाहते हैं, तो मैं स्पष्ट रूप से विधि समूह रूपांतरण से सेट के निर्माण को अलग करता हूं, स्पष्टता के लिए:

public static bool IsUnique<T>(this IEnumerable<T> source) 
{ 
    // TODO: validation 
    var distinctItems = new HashSet<T>(); 
    // Add will return false if the element already exists. If 
    // every element is actually added, then they must all be unique. 
    return source.All(distinctItems.Add); 
} 
+0

@ रूबेनबार्टेलिंक: जब मैंने अपना लेखन शुरू नहीं किया था, नहीं। न ही मैंने देखा कि आप स्वयं जवाब देने जा रहे थे। –

+0

@ रूबेनबार्टेलिंक: मैंने इसे नहीं देखा क्योंकि मैं खुद ही प्रश्न के बारे में उलझन में व्यस्त था, जो समस्या है। वैसे भी, कुछ उत्तरों के साथ जो विभिन्न पहलुओं पर जोर देते हैं, कोई नुकसान नहीं होता है। –

+0

मेरी सभी टिप्पणियों को साफ-सुथरा सामान में हटा दिया गया। विस्तार विधि में टिप्पणियों के रूप में स्वीकृत महत्वपूर्ण हैं और मैंने उन्हें लिया। –

7

यह इनलाइन कर (मैं अगर किसी डुप्लिकेट का कहना है सकते हैं इस सवाल का और/या उसके जवाब को नष्ट करने में खुशी होगी), आप बदल सकते हैं:

collection.Count() == collection.Distinct().Count() 

साथ

collection.All(new HashSet<T>().Add); 

(जहां T आपके संग्रह के तत्वों का प्रकार है)

या आप एक सहायक विस्तार विधि [1] को ऊपर निकाल सकते हैं तो आप कह सकते हैं:

collection.IsUnique() 

[1]

static class EnumerableUniquenessExtensions 
{ 
    public static bool IsUnique<T>(this IEnumerable<T> that) 
    { 
     return that.All(new HashSet<T>().Add); 
    } 
} 

(और जॉन उसके जवाब में बताया गया है के रूप में, एक सच अलग और टिप्पणी जैसे 'मासूमियत' के रूप में दो लाइनों आम तौर पर नहीं एक अच्छा विचार)

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