Jika saya punya Dictionary<String,...>
, mungkinkah membuat metode seperti ContainsKey
case-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 ContainsKey
case-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 IEqualityComparer
yang memberi tahu kamus cara membandingkan kunci.
StringComparer.InvariantCultureIgnoreCase
memberi Anda IEqualityComparer
contoh 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")))
Any
ke SingleOrDefault
Anda tidak akan null
kembali jika itu tidak ada, sebaliknya Anda akan mendapatkan nilai kuncipasangan dengan kedua kunci dan nilai diatur ke null
!
Contains
Sepertinya kasus penggunaan yang sangat spesifik untuk sesuatu yang sedang Anda kerjakan saat itu. Sebagai jawaban yang lebih umum dan bermanfaat, saya pikir Equals
lebih 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 ...