संग्रह # सेट करें?


487

क्या किसी को पता है कि क्या SetC # में Java के कलेक्शन के बराबर है ? मुझे पता है कि आप कुछ हद तक एक Dictionaryया HashTableपॉप्युलेट करके या मूल्यों की अनदेखी करते हुए सेट की नकल कर सकते हैं, लेकिन यह बहुत सुरुचिपूर्ण तरीका नहीं है।

जवाबों:


140

HashSet आज़माएँ :

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

HashSet (T) ऑब्जेक्ट की क्षमता उन तत्वों की संख्या है जो ऑब्जेक्ट धारण कर सकता है। एक हैशसेट (टी) ऑब्जेक्ट की क्षमता स्वचालित रूप से बढ़ जाती है क्योंकि तत्वों को ऑब्जेक्ट में जोड़ा जाता है।

HashSet (T का) वर्ग गणितीय सेटों के मॉडल पर आधारित है और शब्दकोश (TKey, TValue) या हैशटेबल संग्रह की कुंजी तक पहुँचने के समान उच्च प्रदर्शन सेट संचालन प्रदान करता है । सरल शब्दों में, HashSet (T) वर्ग को मूल्यों के साथ एक शब्दकोश (TKey, TValue) संग्रह के रूप में माना जा सकता है ।

HashSet (T का) संग्रह सॉर्ट नहीं किया गया है और इसमें डुप्लिकेट तत्व नहीं हो सकते ...


8
दुर्भाग्य से, हैशसेट को हाल ही में नहीं जोड़ा गया था। यदि आप ढांचे के पुराने संस्करण में काम कर रहे हैं, तो आपको अपने मुंग वाले शब्दकोश <> या हैशटेबल के साथ रहना होगा।
ग्रेग डी

411

यदि आप .NET 3.5 का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं HashSet<T>। यह सच है कि .NET सेट के साथ-साथ जावा के लिए भी पूरा नहीं करता है।

Wintellect PowerCollections भी मदद मिल सकती है।


16
मुझे संदेह है कि सेट कुछ भाषाओं में एक कीवर्ड है, जो मुद्दों का कारण बन सकता है।
जॉन स्कीट

3
@ गायब: नहीं, यह नहीं है। सी # 3 कल्पना की धारा 2.4.3 देखें। इसका केवल गुणों के लिए विशेष अर्थ है।
जॉन स्कीट

28
सिर्फ सेट के बजाय इसे हैशसेट कहने का कारण जावा में समान है- "सेट" एक इंटरफ़ेस का वर्णन करता है, जबकि "हैशसेट" एक कार्यान्वयन का वर्णन करता है- विशेष रूप से, यह एक सेट हैश मैप द्वारा समर्थित है। इस तरह, हम जानते हैं (या दृढ़ता से उम्मीद करनी चाहिए) कि डालने और पहुंच में ओ (1) एक्सेस समय लेना चाहिए, एक "लिंक्डलिस्टसेट" बनाम जो हमें ओ (एन) समय लेने के लिए सम्मिलित करने और एक्सेस करने की उम्मीद करेगा।
डेविड सूथर

5
आपका क्या मतलब है ".NET सेट के साथ-साथ जावा के लिए हालांकि पूरा नहीं करता है।" क्या यह सेट किसी तरह जावा की तुलना में अपूर्ण है?
लुई राइज

34
@ लुईस: आप किस सेट की बात कर रहे हैं? जावा है बहुत सारे विभिन्न स्थितियों के लिए सेट के विभिन्न कार्यान्वयन की। .NET में एक .NET 3.5 (HashSet) और .NET 4 में दो (HashSet और SortedSet) हैं। तथ्य यह है कि हम .net 3.5 के साथ शुरू करने के लिए इंतजार करना पड़ा बहुत आश्चर्य की बात है।
जॉन स्कीट

26

यदि आप .NET 4.0 या बाद में उपयोग कर रहे हैं:

मामले में जहां आपको छंटाई की आवश्यकता है, तब उपयोग करें SortedSet<T>। अन्यथा यदि आप नहीं करते हैं, तो इसका उपयोग करें HashSet<T>क्योंकि यह O(1)खोज के लिए है और संचालन में हेरफेर करता है। जबकि SortedSet<T>है O(log n)खोज के लिए और संचालन में हेरफेर।



13

मैं Dictionary<T, object>मानों में नल के संचय के आसपास एक आवरण का उपयोग करता हूं । यह O (1) ऐड, लुकअप और कीज़ को हटाता है, और सभी इंटेंट्स और उद्देश्यों के लिए एक सेट की तरह कार्य करता है।


2
आपको इसका मतलब होना चाहिए कि यह लगभग std :: unordered_set के बराबर है। std :: set का आदेश दिया गया है। उदाहरण के लिए, आप जल्दी से एक सीमा के प्रारंभ और अंत बिंदु को ढूंढ सकते हैं और शुरू से अंत तक की-ऑर्डर में वस्तुओं का दौरा कर सकते हैं। छंटनी का आधार लगभग :: एसटीडी सेट के बराबर है।
doug65536

11

CodePlex पर PowerCollections पर एक नज़र है । सेट और ऑर्डरडसेट के अलावा इसके कुछ अन्य उपयोगी संग्रह प्रकार हैं जैसे कि डेक्स, मल्टीएडर्ब, बैग, ऑर्डरडैब, ऑर्डरडेडबर्ड और ऑर्डरेडमुलटाइडर।

अधिक संग्रह के लिए, C5 जेनरिक कलेक्शन लाइब्रेरी भी है


-5

मुझे पता है कि यह एक पुराना धागा है, लेकिन मैं एक ही समस्या में चल रहा था और HashSet को बहुत अविश्वसनीय पाया क्योंकि एक ही बीज, GetHashCode () को अलग-अलग कोड दिए गए। तो, मैंने सोचा, क्यों न एक सूची का उपयोग किया जाए और इस तरह से ऐड पद्धति को छिपाया जाए

public class UniqueList<T> : List<T>
{
    public new void Add(T obj)
    {
        if(!Contains(obj))
        {
            base.Add(obj);
        }
    }
}

क्योंकि सूची समानता का निर्धारण करने के लिए पूरी तरह से समान पद्धति का उपयोग करती है, आप अपने इच्छित परिणाम प्राप्त करने के लिए अपने टी प्रकार पर समान पद्धति को परिभाषित कर सकते हैं।


13
क्योंकि कारण है कि आप इस का उपयोग नहीं करना चाहते है List.Containsकी है O(n)जटिलता जो मतलब है कि आपके Addविधि अब हो जाता है O(n)और साथ ही जटिलता। यह मानकर कि आंतरिक संग्रह को Addदोनों के लिए , आकार बदलने की आवश्यकता नहीं है Listऔर जटिलता HashMapकी होनी चाहिए O(1)। TLDR: यह काम करेगा, लेकिन यह हैकरी और कम कुशल है।
रिचर्ड मार्सेल - Drackir

6
ज़रूर, अगर आपकी वस्तुएँ GetHashCode के लिए उचित मान नहीं लौटाती हैं, तो आपको उन्हें हैश-आधारित कंटेनर में नहीं रखना चाहिए। कम कुशल कंटेनर का उपयोग करने की तुलना में गेटहैशकोड को ठीक करना बेहतर होगा।
bmm6o
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.