StringComparer
値を取得しようとするポイントでaを指定する方法はありません。あなたはそれについて考える、場合"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);
次に、この新しいディクショナリはso でGetHashCode()
実装を使用し、同じ値を提供します。StringComparer.OrdinalIgnoreCase
comparer.GetHashCode("foo")
comparer.GetHashcode("FOO")
あるいは、ディクショナリにいくつかの要素しかない場合、および/または1回または2回ルックアップするだけでよい場合は、元のディクショナリをとして扱い、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)になります。