अगर मेरे पास केस-असंवेदनशील Dictionary<String,...>
जैसे तरीके बनाना संभव है ContainsKey
?
यह संबंधित लग रहा था, लेकिन मुझे यह ठीक से समझ में नहीं आया: सी # शब्दकोश: घोषणाओं के माध्यम से महत्वपूर्ण मामला असंवेदनशील बना
अगर मेरे पास केस-असंवेदनशील Dictionary<String,...>
जैसे तरीके बनाना संभव है ContainsKey
?
यह संबंधित लग रहा था, लेकिन मुझे यह ठीक से समझ में नहीं आया: सी # शब्दकोश: घोषणाओं के माध्यम से महत्वपूर्ण मामला असंवेदनशील बना
जवाबों:
यह संबंधित लग रहा था, लेकिन मुझे यह ठीक से समझ में नहीं आया: सी # शब्दकोश: घोषणाओं के माध्यम से महत्वपूर्ण मामला असंवेदनशील बना
यह वास्तव में संबंधित है। समाधान यह है कि मानक आवृत्ति तुलना विधि (जो मामला संवेदनशील है) का उपयोग न करने के लिए शब्दकोश उदाहरण बताएं, बल्कि असंवेदनशील मामले का उपयोग करें। यह उपयुक्त कंस्ट्रक्टर का उपयोग करके किया जाता है :
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
कंस्ट्रक्टर को उम्मीद है कि IEqualityComparer
जो शब्दकोश को बताता है कि चाबियों की तुलना कैसे करें।
StringComparer.InvariantCultureIgnoreCase
आपको एक IEqualityComparer
उदाहरण देता है जो केस-असंवेदनशील तरीके से तार की तुलना करता है।
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
ऐसे कुछ मौके हैं जहां आपकी डील डिक्शनरी के साथ होती है जिसे 3rd पार्टी या एक्सटर्नल डीएल से लिया जाता है। Linq का उपयोग करना
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Any
देते SingleOrDefault
हैं तो सावधानी का एक शब्द null
वापस नहीं आएगा यदि यह मौजूद नहीं है, इसके बजाय आपको कुंजी और मान दोनों के साथ कीवल्यूपेयर मिलेगा null
!
Contains
उस समय आप जिस चीज़ पर काम कर रहे थे, वह बहुत विशिष्ट उपयोग-मामला लगता है। अधिक सामान्य सहायक उत्तर के रूप में, मुझे लगता Equals
है कि बेहतर है। और उसी नोट पर, स्ट्रिंग को डुप्लिकेट करने के बजाय ToLower()
, इसका उपयोग करना और भी बेहतर होगा StringComparison.xxxCase
।
dict.Keys.Contains("bla", appropriate comparer)
आसानी के लिए LINQ ओवरलोड का उपयोग करें।
मैं बस उसी तरह की परेशानी में भाग गया, जहां मुझे 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!");
यदि आपके पास इंस्टेंस निर्माण में कोई नियंत्रण नहीं है, तो मान लें कि आपकी वस्तु को json आदि से नष्ट कर दिया गया है, आप एक रैपर क्लास बना सकते हैं जो डिक्शनरी क्लास से विरासत में मिली है।
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
StringComparer.InvariantCultureIgnoreCase
? यह वही करता है जो यह कहता है ...