1

大文字と小文字を区別する辞書(非常に巨大なもの)があります。このディクショナリのキーを大文字と小文字を区別しない (大文字と小文字を区別しない) を使用して検索したい。ディクショナリに含まれるデータが多すぎるため、 foreach を使用してこのディクショナリ全体を反復処理し、各値を比較したくありません。

C# を使用してこれを行うためのより良い (最も効率的な) 方法はありますか? いくつかの提案が欲しいです。

4

2 に答える 2

4

したがって、私が正しく理解している場合は、文字列をそのまま保持する辞書が必要ですが、大文字と小文字を区別しない方法でハッシュして、大文字と小文字に関係なく O(1) 償却時間で検索できますか?

私が見る方法では、このコンストラクターIEqualityComparerを使用して作成するとき、および処理文字列を実装するときに、たとえばすべて大文字または小文字であり、ハッシュ コードと同じであるかのようにカスタムを渡す必要があります (つまり、文字列のハッシュ コードを返します)。大文字に変わります)。DictionaryIEqualityComparer

例えば:

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」)と同じように扱われます。

于 2012-06-29T12:04:50.233 に答える
2

チューダーの答えは良いものでした StringComparer.CurrentCultureIgnoreCase。独自の比較クラスを作成する代わりに を使用することをお勧めします (特に期待される結果が同じ場合)。

例 :

Dictionary<string, string> openWith = 
                  new Dictionary<string, string>( 
                      StringComparer.CurrentCultureIgnoreCase);

ソース: http://msdn.microsoft.com/en-us/library/ms132072.aspx

于 2013-03-06T18:08:57.613 に答える