2009-05-28 16 views
75

किसी भी डुप्लीकेट को अनदेखा तारों की सूची को स्टोर करने का सबसे प्रभावी तरीका क्या है? मैं सोच रहा था कि एक शब्दकोश डिक्शनरी [str] = false लिखकर सबसे अच्छा स्ट्रिंग डालने वाला हो सकता है; और एक सूची के रूप में कुंजी के माध्यम से गणना। क्या यह एक अच्छा समाधान है?अद्वितीय तारों की कुशल सूची सी #

उत्तर

97

यदि आप .NET 3.5 का उपयोग कर रहे हैं, तो HashSet आपके लिए काम करना चाहिए।

HashSet < (< के (टी>)>) वर्ग उच्च प्रदर्शन सेट आपरेशन प्रदान करता है। एक सेट एक संग्रह है जिसमें डुप्लिकेट तत्व नहीं हैं, और जिनके तत्व किसी विशेष क्रम में नहीं हैं।

+3

लेकिन एक 'HashSet' वस्तुओं के आदेश को खो देंगे। एक सुविधा 'सूची' प्रदान करता है। – aggsol

+4

अतिरिक्त: सॉर्टेडसेट भी है जो एक सुविधाजनक सॉर्ट हैशसेट है। – WhoIsRich

+0

यह भी ध्यान रखें कि सूची में विरोध के रूप में केवल एक गणक के माध्यम से हैशसेट को इंडिस के माध्यम से नहीं पहुंचा जा सकता है। – andrew

2

यह सिस्टम नेमस्पेस का हिस्सा नहीं है, लेकिन नेइबेरनेट के साथ http://www.codeproject.com/KB/recipes/sets.aspx से Iesi.Collections का उपयोग किया है। इसमें सॉर्ट किए गए सेट, डिक्शनरी सेट आदि के साथ हैश सेट के लिए समर्थन है। चूंकि इसका उपयोग एनएचबेर्नेट के साथ किया गया है, इसका उपयोग बड़े पैमाने पर और बहुत स्थिर किया गया है। यह भी नेट की आवश्यकता नहीं है 3.5

17

आप इस

var hash = new HashSet<string>(); 
var collectionWithDup = new []{"one","one","two","one","two","zero"}; 

// No need to check for duplicates as the Add method 
// will only add it if it doesn't exist already 
foreach (var str in collectionWithDup) 
    hash.Add(str); 
+32

आपको हैशसेट के साथ चेक की आवश्यकता नहीं है।आप केवल ऐड विधि को सीधे कॉल कर सकते हैं और आइटम पहले से मौजूद है या नहीं, इस पर निर्भर करता है कि यह सही या गलत होगा। – LukeH

+1

अनावश्यक कंटेनर में कॉल को हटाने के लिए उत्तर संपादित किया जाना चाहिए। काम करने के लिए उपरोक्त उदाहरण के लिए आपको यह सब कुछ चाहिए: var collectionWithDup = new [] {"one", "one", "two", "one", "two", "zero"}; var uniqueValues ​​= new हैशसेट (संग्रह WithDup); – user3285954

12

की तरह कुछ करने के लिए मुझे यकीन है कि नहीं कर रहा हूँ अगर यह एक अच्छा जवाब के रूप में गिना जाता है, लेकिन देख सकते हैं जब एक अद्वितीय सेट के लिए की जरूरत का सामना करना पड़ जो सम्मिलन आदेश को बनाए रखता है, मैंने हैशसेट और एक सूची के साथ एक समझौता किया। इस मामले में, जब भी आप सेट में जोड़ते हैं, तो निम्न कार्य करें:

if(hashSet.Add(item)) 
    orderList.Add(item); 

आइटम को हटाते समय, उन्हें दोनों से निकालना सुनिश्चित करें। इस प्रकार, जब तक आप यह सुनिश्चित कर सकें कि सूची में कुछ और आइटम नहीं जोड़े गए हैं, तो आपके पास एक प्रविष्टि-आदेश दिया गया अद्वितीय सेट होगा!

6

हैशसेट का उपयोग करें, जांचने की कोई आवश्यकता नहीं है। कॉन्टैन्स(), बस अपनी वस्तुओं को सूची में जोड़ें और यदि इसका डुप्लिकेट इसे जोड़ नहीं देगा।

HashSet<int> uniqueList = new HashSet<int>(); 
    uniqueList.Add(1); // List has values 1 
    uniqueList.Add(2); // List has values 1,2 
    uniqueList.Add(1); // List has values 1,2 
    Console.WriteLine(uniqueList.Count); // it will return 2 
2

यहाँ HashSet का उपयोग किए बिना एक और उपाय है।

var items = new List<string>() { "one", "one", "two", "one", "two", "zero" }; 
var uniqueItems = items.Where((item, index) => items.IndexOf(item) == index); 

यह इस धागे से अपनाया गया था: javascript - Unique values in an array

टेस्ट: List, HashSet और SortedSet के लिए

using FluentAssertions; 

uniqueItems.Count().Should().Be(3); 
uniqueItems.Should().BeEquivalentTo("one", "two", "zero"); 

प्रदर्शन परीक्षण। 1 लाख पुनरावृत्तियों:

List: 564 ms 
HashSet: 487 ms 
SortedSet: 1932 ms 

Test source code (gist)

1

तुम भी में के रूप में इस्तेमाल कर सकते हैं Linq:

using System.Linq; 

var items = new List<string>() { "one", "one", "two", "one", "two", "zero" }; 

List<string> distinctItems = items.Distinct().ToList(); 
संबंधित मुद्दे