2010-04-19 8 views
59

मामले में संवेदनशील मोड में HashSet<string>.Contains() विधि का उपयोग कैसे करें?हैशसेट <string> का उपयोग कैसे करें। केस-असंवेदनशील मोड में() विधि शामिल है?

HashSet<string> hs = new HashSet<string>(StringComparer.OrdinalIgnoreCase); 

hs.Add("Hello"); 

Console.WriteLine(hs.Contains("HeLLo")); 
+4

एक sidenode: जब एक 'सामान्य' 'HashSet ' (केस संवेदी) बनाई गई है, यह एक 'contains' विधि कुशल है कि बनाने के लिए असंभव है। ऐसा इसलिए है क्योंकि तत्वों के हैंश बनाए जाते हैं जब उन्हें 'हैशसेट' में जोड़ा जाता है। और आंतरिक रूप से 'शामिल' विधि हैश को कुशल होने की जांच करता है। किसी मौजूदा हैश फॉर्म 'केस सेंसिटिव' को 'केस असंवेदनशील' में परिवर्तित करना (कुशलतापूर्वक) करना संभव नहीं है। – Julian

उत्तर

100

आप एक कस्टम comparer साथ HashSet बना सकते हैं:

+13

+1 क्योंकि आप 'InvariantCulture' के बजाय' ऑर्डिनल 'का उपयोग करते हैं। .NET दिशानिर्देश हमें सलाह देते हैं कि ज्यादातर मामलों में 'InvariantCulture' का उपयोग न करें (देखें: http://msdn.microsoft.com/en-us/library/ms973919.aspx)। – Steven

+1

CurrentCultureIgnoreCase आमतौर पर बेहतर विकल्प होता है। –

+3

@ हंसपैसेंट क्यों? – guiomie

9

आप सही IEqualityComparer के साथ बनाने की जरूरत आप उपयोग करना चाहते हैं।

HashSet<String> hashSet = new HashSet<String>(StringComparer.InvariantCultureIgnoreCase); 

StringComparer वस्तु स्थिर गुणों के रूप में कुछ अक्सर इस्तेमाल किया comparer प्रदान करता है।

5

आप constructor जो आप IEqualityComparer निर्दिष्ट कर सकते हैं का उपयोग करना चाहिए:

HashSet<string> hashset = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase); 
4

अन्य उत्तरों के प्रदर्शन के रूप में यहां जरूरी नहीं है, लेकिन अन्य मामलों में जहां आप एक स्ट्रिंग का उपयोग नहीं कर रहे हैं, तो आप IEqualityComparer<T> को कार्यान्वित करना चुन सकते हैं और फिर आप .Contains ओवरलोड का उपयोग कर सकते हैं। यहां एक स्ट्रिंग का उपयोग करके एक उदाहरण दिया गया है (फिर से, अन्य उत्तरों ने दिखाया है कि पहले से ही एक स्ट्रिंग तुलनाकर्ता है जिसका उपयोग आप अपनी आवश्यकताओं को पूरा कर सकते हैं)। IEnumerable<T> के आसपास कई विधियों में अधिभार है जो ऐसे तुलनाकर्ताओं को स्वीकार करते हैं, इसलिए उन्हें सीखना सीखना अच्छा होता है।

class CustomStringComparer : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
     return x.Equals(y, StringComparison.InvariantCultureIgnoreCase); 
    } 

    public int GetHashCode(string obj) 
    { 
     return obj.GetHashCode(); 
    } 
} 

और फिर का उपयोग यह

bool contains = hash.Contains("foo", new CustomStringComparer()); 
संबंधित मुद्दे