StringComparer
Bir değer elde etmeye çalıştığınız noktada a belirtmenin bir yolu yoktur . Bunu düşünürseniz "foo".GetHashCode()
ve "FOO".GetHashCode()
tamamen farklıysanız, büyük / küçük harfe duyarlı bir karma haritaya büyük / küçük harfe duyarlı olmayan bir uygulama uygulamak için makul bir yol yoktur.
Bununla birlikte, aşağıdakileri kullanarak ilk etapta büyük / küçük harfe duyarlı olmayan bir sözlük oluşturabilirsiniz: -
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
Veya mevcut büyük / küçük harfe duyarlı bir sözlüğün içeriği ile büyük / küçük harfe duyarlı olmayan bir sözlük oluşturun (büyük / küçük harfe çarpışma olmadığından eminseniz): -
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
Bu yeni sözlük ardından kullandığı GetHashCode()
üzerinde uygulanmasını StringComparer.OrdinalIgnoreCase
yüzden comparer.GetHashCode("foo")
ve comparer.GetHashcode("FOO")
size aynı değeri verir.
Alternatif olarak, sözlükte yalnızca birkaç öğe varsa ve / veya yalnızca bir veya iki kez arama yapmanız gerekiyorsa, orijinal sözlüğü bir olarak ele alabilir IEnumerable<KeyValuePair<TKey, TValue>>
ve üzerinde tekrarlayabilirsiniz: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
Veya LINQ olmadan tercih ederseniz: -
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
int? value;
foreach (var element in myDictionary)
{
if (String.Equals(element.Key, myKey, comparer))
{
value = element.Value;
break;
}
}
Bu, yeni bir veri yapısı oluşturma maliyetinden tasarruf etmenizi sağlar, ancak bunun karşılığında bir arama maliyeti O (1) yerine O (n) olur.