केस-इनसेंसिटिव डिक्शनरी जिसमें स्ट्रिंग की-टाइप सी # है।


155

अगर मेरे पास केस-असंवेदनशील Dictionary<String,...>जैसे तरीके बनाना संभव है ContainsKey?

यह संबंधित लग रहा था, लेकिन मुझे यह ठीक से समझ में नहीं आया: सी # शब्दकोश: घोषणाओं के माध्यम से महत्वपूर्ण मामला असंवेदनशील बना


5
उपयोग करने में क्या गलत है StringComparer.InvariantCultureIgnoreCase? यह वही करता है जो यह कहता है ...
लेप्पी

5
मैं इसके बारे में कभी नहीं सुना था, इसलिए सवाल!
मिस्टर बॉय


यह प्रश्न संबंधित है, लेकिन इस एक की नकल नहीं है। यह एक मौजूदा शब्दकोश से निपटने के लिए कैसे जाता है। मैं नए कोड के साथ शुरुआत कर रहा हूं, इसलिए यहां के उत्तर बेहतर अनुकूल हैं।
गोडेई

जवाबों:


321

यह संबंधित लग रहा था, लेकिन मुझे यह ठीक से समझ में नहीं आया: सी # शब्दकोश: घोषणाओं के माध्यम से महत्वपूर्ण मामला असंवेदनशील बना

यह वास्तव में संबंधित है। समाधान यह है कि मानक आवृत्ति तुलना विधि (जो मामला संवेदनशील है) का उपयोग न करने के लिए शब्दकोश उदाहरण बताएं, बल्कि असंवेदनशील मामले का उपयोग करें। यह उपयुक्त कंस्ट्रक्टर का उपयोग करके किया जाता है :

var dict = new Dictionary<string, YourClass>(
        StringComparer.InvariantCultureIgnoreCase);

कंस्ट्रक्टर को उम्मीद है कि IEqualityComparerजो शब्दकोश को बताता है कि चाबियों की तुलना कैसे करें।

StringComparer.InvariantCultureIgnoreCaseआपको एक IEqualityComparerउदाहरण देता है जो केस-असंवेदनशील तरीके से तार की तुलना करता है।


1
बिल्कुल सही, मैंने किसी तरह एसटीएल-जैसे रास्ते को टटोलने वाले से गुजरने से चूक लिया।
श्री बॉय

7
यह कभी भी मुझे विस्मित नहीं करता है कि मैं हमेशा यहाँ पर किसी भी कोडिंग प्रश्न का उत्तर कैसे ढूंढता हूँ! हो सकता है कि मैं अपनी अगली बिल्ली का नाम तुम्हारे बाद, कोनराड रख दूं! :-)
जेमी

10
संभव, StringComparison.OrdinalIgnoreCase की तुलना में तेजी से संस्कृति-आधारित: stackoverflow.com/questions/492799/…
मानुषिन इगोर

यदि मैं एक शब्दकोश नहीं बना रहा हूं, लेकिन एक मौजूदा शब्दकोष पर केस असंवेदनशील कुंजी मैच के लिए ContainsKey () का उपयोग करने की कोशिश कर रहा हूं तो मैं इसे कैसे करूं?
श्रीधर आर कुलकर्णी

1
@ShridharRKulkarni आप मूल रूप से (कुशलतापूर्वक) नहीं कर सकते। तुलना तर्क आंतरिक शब्दकोश डेटा संरचना का एक मुख्य हिस्सा है। इसे अनुमति देने के लिए, कंटेनर को अपने डेटा के लिए कई सूचकांकों को बनाए रखना होगा, और शब्दकोशों ऐसा नहीं करते हैं।
कोनराड रुडोल्फ

21
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");

if (myDic.ContainsKey("hello"))
    Console.WriteLine(myDic["hello"]);

1
कोड स्निपेट यह सब कहता है। बहुत मददगार। निश्चित नहीं है कि इस पोस्ट में केवल 3 मिनट की देरी से स्वीकृत उत्तर की तुलना में इतने कम उत्थान हैं।
आरबीटी

14

ऐसे कुछ मौके हैं जहां आपकी डील डिक्शनरी के साथ होती है जिसे 3rd पार्टी या एक्सटर्नल डीएल से लिया जाता है। Linq का उपयोग करना

YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))


3
यह बहुत अच्छा काम करता है। हालाँकि, यदि आप इसे बदल Anyदेते SingleOrDefaultहैं तो सावधानी का एक शब्द nullवापस नहीं आएगा यदि यह मौजूद नहीं है, इसके बजाय आपको कुंजी और मान दोनों के साथ कीवल्यूपेयर मिलेगा null!
NIBlyPig

1
Containsउस समय आप जिस चीज़ पर काम कर रहे थे, वह बहुत विशिष्ट उपयोग-मामला लगता है। अधिक सामान्य सहायक उत्तर के रूप में, मुझे लगता Equalsहै कि बेहतर है। और उसी नोट पर, स्ट्रिंग को डुप्लिकेट करने के बजाय ToLower(), इसका उपयोग करना और भी बेहतर होगा StringComparison.xxxCase
सुमेर

1
यह बहुत उपयोगी था और ToLower से छुटकारा पाना निश्चित रूप से एक सुधार है - मेरा उपयोग मामला था: AppliedBuffs.Any (b => b.Key.Equals (नाम, StringComparison.OrdinalIgnorefase)); एक आदर्श संवेदनशील शब्दकोश में एक आदर्श केस-असंवेदनशील सम्‍मिलित है।
डेविड बर्फोर्ड 10

मुझे यह बहुत लुभाता है। सावधानी का शब्द, यदि आप शब्दकोश के मालिक हैं तो यह निश्चित रूप से इसे करने का तरीका नहीं है। केवल इस दृष्टिकोण का उपयोग करें यदि आप नहीं जानते कि शब्दकोश कैसे त्वरित था। फिर भी, स्ट्रिंग के सटीक मिलान के लिए (न कि केवल पार्ट मैच), उपयोग में dict.Keys.Contains("bla", appropriate comparer)आसानी के लिए LINQ ओवरलोड का उपयोग करें।
नवाफल

1

मैं बस उसी तरह की परेशानी में भाग गया, जहां मुझे ASP.NET कोर कंट्रोलर में केसिनेंसिव डिक्शनरी की जरूरत थी।

मैंने एक विस्तार विधि लिखी है जो ट्रिक करती है। शायद यह दूसरों के लिए भी मददगार हो सकता है ...

public static IDictionary<string, TValue> ConvertToCaseInSensitive<TValue>(this IDictionary<string, TValue> dictionary)
{
    var resultDictionary = new Dictionary<string, TValue>(StringComparer.InvariantCultureIgnoreCase);
    foreach (var (key, value) in dictionary)
    {
        resultDictionary.Add(key, value);
    }

    dictionary = resultDictionary;
    return dictionary;
}

विस्तार विधि का उपयोग करने के लिए:

myDictionary.ConvertToCaseInSensitive();

तब शब्दकोश के साथ एक मूल्य प्राप्त करें:

myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");

0

यदि आपके पास इंस्टेंस निर्माण में कोई नियंत्रण नहीं है, तो मान लें कि आपकी वस्तु को json आदि से नष्ट कर दिया गया है, आप एक रैपर क्लास बना सकते हैं जो डिक्शनरी क्लास से विरासत में मिली है।

public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
    public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.