अद्वितीय तार सी # की कुशल सूची


86

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

जवाबों:


111

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

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


5
लेकिन एक HashSetआइटम के क्रम को खो देगा। एक सुविधा एक Listप्रदान करता है।
अग्सोल १०'१५

4
अतिरिक्त: इसमें SortedSet <T> भी है जो एक सुविधाजनक सॉर्ट किया गया HashSet है।
WhoIsRich

यह भी ध्यान दें कि हैशसेट को इंडेक्स के माध्यम से एक्सेस नहीं किया जा सकता है, केवल सूची के रूप में एक एन्यूमरेटर के माध्यम से।
एंड्रयू

23

आप ऐसा कुछ करने के लिए देख सकते हैं

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);   

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

1
उत्तर को निरर्थक सम्‍मिलित कॉल हटाने के लिए संपादित किया जाना चाहिए। यह सब आपको काम करने के लिए उपरोक्त उदाहरण के लिए चाहिए: var collectionWithDup = new [] {"एक", "एक", "दो", "एक", "दो", "शून्य"}; var uniqueValues ​​= new HashSet <string> (collectionWithDup);
user3285954

14

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

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

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


10

आप इसके रूप में भी Linq का उपयोग कर सकते हैं:

using System.Linq;

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

List<string> distinctItems = items.Distinct().ToList();

8

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

   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

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


2

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

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

यह इस धागे से अपनाया गया था: जावास्क्रिप्ट - एक सरणी में अद्वितीय मान

परीक्षा:

using FluentAssertions;

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

के लिए प्रदर्शन परीक्षण List, HashSetऔर SortedSet। 1 मिलियन पुनरावृत्तियों:

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

टेस्ट सोर्स कोड (जिस्ट)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.