大文字と小文字を区別する辞書(非常に巨大なもの)があります。このディクショナリのキーを大文字と小文字を区別しない (大文字と小文字を区別しない) を使用して検索したい。ディクショナリに含まれるデータが多すぎるため、 foreach を使用してこのディクショナリ全体を反復処理し、各値を比較したくありません。
C# を使用してこれを行うためのより良い (最も効率的な) 方法はありますか? いくつかの提案が欲しいです。
大文字と小文字を区別する辞書(非常に巨大なもの)があります。このディクショナリのキーを大文字と小文字を区別しない (大文字と小文字を区別しない) を使用して検索したい。ディクショナリに含まれるデータが多すぎるため、 foreach を使用してこのディクショナリ全体を反復処理し、各値を比較したくありません。
C# を使用してこれを行うためのより良い (最も効率的な) 方法はありますか? いくつかの提案が欲しいです。
したがって、私が正しく理解している場合は、文字列をそのまま保持する辞書が必要ですが、大文字と小文字を区別しない方法でハッシュして、大文字と小文字に関係なく O(1) 償却時間で検索できますか?
私が見る方法では、このコンストラクターIEqualityComparer
を使用して作成するとき、および処理文字列を実装するときに、たとえばすべて大文字または小文字であり、ハッシュ コードと同じであるかのようにカスタムを渡す必要があります (つまり、文字列のハッシュ コードを返します)。大文字に変わります)。Dictionary
IEqualityComparer
例えば:
class MyComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return x.ToUpper() == y.ToUpper();
}
public int GetHashCode(string obj)
{
return obj.ToUpper().GetHashCode();
}
}
...
Dictionary<String, String> dict = new Dictionary<string, string>(new MyComparer());
実際には、辞書は通常どおり文字列を保持しますが、検索または追加すると、それらがすべて大文字であるかのように扱われるため、「AbcD」は「aBCd」(両方とも「ABCD」)と同じように扱われます。
チューダーの答えは良いものでした StringComparer.CurrentCultureIgnoreCase
。独自の比較クラスを作成する代わりに を使用することをお勧めします (特に期待される結果が同じ場合)。
例 :
Dictionary<string, string> openWith =
new Dictionary<string, string>(
StringComparer.CurrentCultureIgnoreCase);