web-dev-qa-db-ja.com

c#辞書:宣言を通じてキーの大文字と小文字を区別しないようにする

Dictionary<string, object>辞書があります。以前はDictionary<Guid, object>でしたが、他の '識別子'が登場し、キーは文字列として処理されるようになりました。

問題は、ソースデータのGuidキーがVarCharとして送られるため、"923D81A0-7B71-438d-8160-A524EA7EFA5E"のキーが"923d81a0-7b71-438d-8160-a524ea7efa5e"と同じではないことです(そうではありませんでした) Guidsを使用する場合の問題)。

.NETフレームワークの本当に素晴らしい(そして甘い)ところは、次のことができることです。

Dictionary<string, CustomClass> _recordSet = new Dictionary<string, CustomClass>(
    StringComparer.InvariantCultureIgnoreCase);

そしてそれは素晴らしく機能します。しかし、ネストされた辞書はどうですか?次のように:

Dictionary<int, Dictionary<string, CustomClass>> _customRecordSet 
    = new  Dictionary<int, Dictionary<string, CustomClass>>();

このようなネストされた辞書で文字列比較子を指定するにはどうすればよいですか?

70
MoSlo

外部ディクショナリに要素を追加するとき、ネストされたディクショナリの新しいインスタンスを作成し、この時点で追加します。IEqualityComparer<TKey>を取る オーバーロードされたコンストラクター を使用します。

_customRecordSet.Add(0, new Dictionary<string, CustomClass>(StringComparer.InvariantCultureIgnoreCase));


Update 08/03/2017:逸話的に、私はStringComparer.OrdinalIgnoreCaseがより効率的であるどこかを読んだ(「高性能.NETコードを書く」と思う)単に文字の大文字小文字を無視したい。しかし、これは私自身がまったく根拠がないので、YMMV。

77

ネストされた辞書を使用するには、それらを初期化する必要があります。その時点で上記のコードを使用するだけです。

基本的に、次のようなコードが必要です。

public void insert(int int_key, string guid, CustomClass obj)
{
    if (_customRecordSet.ContainsKey(int_key)
         _customRecordSet[int_key][guid] = obj;
    else
    {
         _customRecordSet[int_key] = new Dictionary<string, CustomClass> 
                                     (StringComparer.InvariantCultureIgnoreCase);
         _customRecordSet[int_key][guid] = obj;
    }
}
8
Patrick