Jika saya punya Dictionary<String,...>, mungkinkah membuat metode seperti ContainsKeycase-insensitive?
Ini sepertinya terkait, tetapi saya tidak memahaminya dengan benar: c # Kamus: membuat Key case-insensitive melalui deklarasi
Jika saya punya Dictionary<String,...>, mungkinkah membuat metode seperti ContainsKeycase-insensitive?
Ini sepertinya terkait, tetapi saya tidak memahaminya dengan benar: c # Kamus: membuat Key case-insensitive melalui deklarasi
Jawaban:
Ini sepertinya terkait, tetapi saya tidak memahaminya dengan benar: c # Kamus: membuat Key case-insensitive melalui deklarasi
Ini memang terkait. Solusinya adalah dengan memberi tahu contoh kamus untuk tidak menggunakan metode perbandingan string standar (yang sensitif huruf besar) melainkan menggunakan huruf besar yang tidak sensitif. Ini dilakukan dengan menggunakan konstruktor yang sesuai :
var dict = new Dictionary<string, YourClass>(
StringComparer.InvariantCultureIgnoreCase);
Konstruktor mengharapkan IEqualityCompareryang memberi tahu kamus cara membandingkan kunci.
StringComparer.InvariantCultureIgnoreCasememberi Anda IEqualityComparercontoh yang membandingkan string dengan cara case-insensitive.
var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase);
myDic.Add("HeLlo", "hi");
if (myDic.ContainsKey("hello"))
Console.WriteLine(myDic["hello"]);
Ada beberapa kemungkinan di mana Anda berurusan dengan kamus yang ditarik dari pihak ke-3 atau dll eksternal. Menggunakan LINQ
YourDictionary.Any(i => i.KeyName.ToLower().Contains("yourstring")))
Anyke SingleOrDefaultAnda tidak akan nullkembali jika itu tidak ada, sebaliknya Anda akan mendapatkan nilai kuncipasangan dengan kedua kunci dan nilai diatur ke null!
ContainsSepertinya kasus penggunaan yang sangat spesifik untuk sesuatu yang sedang Anda kerjakan saat itu. Sebagai jawaban yang lebih umum dan bermanfaat, saya pikir Equalslebih baik. Dan pada catatan yang sama, alih-alih menduplikasi string ToLower(), Akan lebih baik untuk digunakan StringComparison.xxxCase.
dict.Keys.Contains("bla", appropriate comparer)kelebihan LINQ untuk kemudahan penggunaan.
Saya baru saja mengalami masalah yang sama di mana saya membutuhkan kamus caseInsensitive dalam pengontrol ASP.NET Core.
Saya menulis metode ekstensi yang melakukan trik. Mungkin ini bisa bermanfaat bagi orang lain juga ...
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;
}
Untuk menggunakan metode ekstensi:
myDictionary.ConvertToCaseInSensitive();
Kemudian dapatkan nilai dari kamus dengan:
myDictionary.ContainsKey("TheKeyWhichIsNotCaseSensitiveAnymore!");
Jika Anda tidak memiliki kendali dalam pembuatan instance, misalkan objek Anda didesterilasi dari json dll, Anda dapat membuat kelas wrapper yang diwarisi dari kelas kamus.
public class CaseInSensitiveDictionary<TValue> : Dictionary<string, TValue>
{
public CaseInSensitiveDictionary() : base(StringComparer.OrdinalIgnoreCase){}
}
StringComparer.InvariantCultureIgnoreCase? Ia melakukan apa yang dikatakannya ...