StringComparer
값을 얻으려고 할 때 지점 을 지정할 방법이 없습니다 . 당신이 그것에 대해 생각 "foo".GetHashCode()
하고 "FOO".GetHashCode()
완전히 다르므로 대소 문자를 구분하지 않는 해시 맵에서 대소 문자를 구분하지 않는 get을 구현할 수있는 합리적인 방법이 없습니다.
그러나 먼저 다음을 사용하여 대소 문자를 구분하지 않는 사전을 작성할 수 있습니다.
var comparer = StringComparer.OrdinalIgnoreCase;
var caseInsensitiveDictionary = new Dictionary<string, int>(comparer);
또는 대소 문자를 구분하지 않는 기존 사전의 내용을 사용하여 대소 문자를 구분하지 않는 새 사전을 작성하십시오 (대소 문자 충돌이없는 경우).
var oldDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var newDictionary = new Dictionary<string, int>(oldDictionary, comparer);
이 새 사전은 그 사용 GetHashCode()
에 구현 StringComparer.OrdinalIgnoreCase
있도록 comparer.GetHashCode("foo")
하고 comparer.GetHashcode("FOO")
당신에게 같은 값을 제공합니다.
또는 사전에 요소가 몇 개만 있거나 한두 번만 조회해야하는 경우 원래 사전을 하나로 간주하고 IEnumerable<KeyValuePair<TKey, TValue>>
반복 할 수 있습니다.
var myKey = ...;
var myDictionary = ...;
var comparer = StringComparer.OrdinalIgnoreCase;
var value = myDictionary.FirstOrDefault(x => String.Equals(x.Key, myKey, comparer)).Value;
또는 원하는 경우 LINQ없이 :-
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;
}
}
이렇게하면 새 데이터 구조를 만드는 데 드는 비용이 절약되지만 대신 조회 비용은 O (1) 대신 O (n)입니다.