1. ホーム
  2. c#

c# Dictionary: 宣言で大文字小文字を区別しないキーにする

2023-10-12 06:02:02

質問内容

私は Dictionary<string, object> という辞書があります。 以前は Dictionary<Guid, object> であったが、他の「識別子」が登場したため、Keyは文字列として扱われるようになった。

問題なのは 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>>();

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

どのように解決するのですか?

外側の辞書に要素を追加する場合、入れ子の辞書の新しいインスタンスを作成することが多いと思いますが、この時点で追加し、外側の辞書の オーバーロードされたコンストラクタ を利用して追加します。 IEqualityComparer<TKey> .

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


2017/03/08に更新しました。 逸話ですが、どこか("Writing High-Performance .NET Code"で読んだと思います)で、次のように書いてありました。 StringComparer.OrdinalIgnoreCase の方が、単純に文字の大文字小文字を無視したい場合には効率的である。しかし、これは私自身にはまったく根拠がないので、YMMV です。