2008-10-02 8 views
5

में कनवर्ट करें मेरे पास एक तरीका है जो पैरामीटर के रूप में IDictionary प्राप्त करता है। अब मैं एक ऐसी विधि प्रदान करना चाहता हूं जो इस शब्दकोश से मूल्य पुनर्प्राप्त करे, लेकिन यह केस-इनवेरिएंट होना चाहिए।IDictionary <स्ट्रिंग, स्ट्रिंग> कुंजी को लोअरकेस (सी #)

तो यह सही करने के लिए अपने समाधान अब एक स्थिर समारोह है कि कुंजी के माध्यम से लूप और उन्हें toLower (धर्मान्तरित) इस तरह के लिए किया गया था:

private static IDictionary<ILanguage, IDictionary<string, string>> ConvertKeysToLowerCase(
    IDictionary<ILanguage, IDictionary<string, string>> dictionaries) 
{ 
    IDictionary<ILanguage, IDictionary<string, string>> resultingConvertedDictionaries 
     = new Dictionary<ILanguage, IDictionary<string, string>>(); 
    foreach(ILanguage keyLanguage in dictionaries.Keys) 
    { 
     IDictionary<string, string> convertedDictionatry = new Dictionary<string, string>(); 
     foreach(string key in dictionaries[keyLanguage].Keys) 
     { 
      convertedDictionatry.Add(key.ToLower(), dictionaries[keyLanguage][key]); 
     } 
     resultingConvertedDictionaries.Add(keyLanguage, convertedDictionatry); 
    } 
    return resultingConvertedDictionaries; 
} 

अब, यह ठीक है, लेकिन अभी भी यह एक बहुत बड़ा है कोड का हिस्सा जो "स्वच्छ और कुशल" के मेरे विचार के विपरीत है। क्या आप इसके लिए कोई विकल्प जानते हैं ताकि शब्दकोश का कॉन्टैन्सकी() विधि आवरण के बीच अंतर न करे?

उत्तर

29

हां - शब्दकोश कन्स्ट्रक्टर StringComparer.OrdinalIgnoreCase (या आपकी संस्कृति-संवेदनशीलता आवश्यकताओं के आधार पर तुलना करने वाले अन्य मामले-अनदेखी तुलनाकर्ता) को पास करें।

जॉन

+0

धन्यवाद! यह काम करता है, लेकिन मुझे अभी भी आईलांगेज शब्दकोश देखने की ज़रूरत है और शब्दकोश मैन्युअल रूप से जोड़ें। कोई रास्ता नहीं मैं इससे छुटकारा पा सकता हूं? – Tigraine

+0

ऐसा नहीं है कि मैं तुरंत सोच सकता हूं। हालांकि यह केवल एक लूप है ... शायद ही कभी पढ़ा जा सकता है। यदि आप .NET 3.5 का उपयोग कर रहे हैं तो आप शायद इसे * थोड़ा * बिट स्ट्रीम कर सकते हैं, लेकिन मैं इसे पसीना नहीं पड़ेगा। क्या आप पहली जगह में केस-असंवेदनशील तुलनाकर्ता निर्दिष्ट करने के लिए मूल शब्दकोश के निर्माता को बदल सकते हैं? –

+0

यह सबसे अच्छा समाधान प्रतीत होता है क्योंकि टिग्रेन हासिल करना चाहता है केस की अनदेखी तुलना और चाबियों को लोअरकेस में कनवर्ट करना यह हासिल करने के लिए केवल एक (अनावश्यक) तरीका है। – VVS

0

आप वर कीवर्ड का उपयोग कुछ अव्यवस्था दूर करने के लिए कर सकता है। तकनीकी रूप से स्रोत वही रहता है। इसके अलावा मैं सिर्फ पास होता है और एक शब्दकोश लौट < स्ट्रिंग, स्ट्रिंग > क्योंकि आप उस ILanguage पैरामीटर के साथ कुछ भी नहीं कर रहे हैं और विधि अधिक पुन: प्रयोज्य बनाने:

private static IDictionary<string, string> ConvertKeysToLowerCase(
    IDictionary<string, string> dictionaries) 
{ 
    var convertedDictionatry = new Dictionary<string, string>(); 
    foreach(string key in dictionaries.Keys) 
    { 
     convertedDictionatry.Add(key.ToLower(), dictionaries[key]); 
    } 
    return convertedDictionatry; 
} 

... और यह बहुत की तरह फोन:

// myLanguageDictionaries is of type IDictionary<ILanguage, IDictionary<string, string>> 
foreach (var dictionary in myLanguageDictionaries.Keys) 
{ 
    myLanguageDictionaries[dictionary].Value = 
     ConvertKeysToLowerCase(myLanguageDictionaries[dictionary].Value); 
} 
+0

अच्छा बिंदु, लेकिन अभी भी लूपिंग के साथ समस्या का समाधान नहीं करता है। मैं जॉन स्कीट के साथ अपने समाधान को जोड़ दूंगा :) धन्यवाद! – Tigraine

+0

खैर .. सूची में प्रत्येक तत्व को बदलने के लिए आपको हर तत्व को स्पर्श करना होगा जो हमेशा लूप में परिणाम देता है। बेशक आप किसी भी तरह से इसे खराब करने की कोशिश कर सकते हैं;) – VVS

1

आप अपने आप को IDictionary से प्राप्त कर सकते हैं, और बस एक आंतरिक शब्दकोश उदाहरण के लिए मार्शल कॉल कर सकते हैं।

Add(string key, string value) { dictionary.Add(key.ToLowerInvariant(), value) ; } 
public string this[string key] 
{ 
    get { return dictionary[key.ToLowerInvariant()]; } 
    set { dictionary[key.ToLowerInvariant()] = value; } 
} 
// And so forth. 
-1

LINQ IEnumerable<T> विस्तार तरीकों का उपयोग कर संस्करण:


     private static IDictionary<ILanguage, IDictionary<string, string>> ConvertKeysToLowerCase(
      IDictionary<ILanguage, IDictionary<string, string>> dictionaries) 
     { 
      return dictionaries.ToDictionary(
       x => x.Key, v => CloneWithComparer(v.Value, StringComparer.OrdinalIgnoreCase)); 
     } 

     static IDictionary<K, V> CloneWithComparer<K,V>(IDictionary<K, V> original, IEqualityComparer<K> comparer) 
     { 
      return original.ToDictionary(x => x.Key, x => x.Value, comparer); 
     } 
1

System.Collections.Specialized.StringDictionary() में मदद कर सकते हैं। MSDN राज्यों:

"कुंजी एक केस-संवेदी ढंग से नियंत्रित किया जाता है, यह इससे पहले कि यह स्ट्रिंग शब्दकोश के साथ प्रयोग किया जाता है लोअरकेस अनुवाद किया है

.NET फ्रेमवर्क 1.0 संस्करण में, इस वर्ग के संस्कृति के प्रति संवेदनशील उपयोग करता है। स्ट्रिंग तुलना। हालांकि, .NET Framework संस्करण 1.1 और बाद में, यह वर्ग स्ट्रिंग की तुलना करते समय CultureInfo.InvariantCulture का उपयोग करता है। संस्कृति कैसे तुलना और सॉर्टिंग को प्रभावित करती है, इस बारे में अधिक जानकारी के लिए, एक विशिष्ट संस्कृति और प्रदर्शन संस्कृति-असंवेदनशील स्ट्रिंग के लिए डेटा की तुलना और सॉर्टिंग देखें संचालन। "