0

.net では、参照ケースを格納するのに最適なデータ構造は何ですか?

エントリが最初に挿入されたケーシングを返すことができるデータ構造を探しています。このようなもの:

Store.Add("HeLLo") //Adds a key

if (Store.Contains("hEllO")) //returns true (case-insensitive lookup)
    Store.Retreive("hEllO")) //return HeLLo, as initially inserted.

私は現在、キーと値が等しい大文字と小文字を区別しない辞書を使用していますが、これは見苦しく感じます。

Dictionary<string, string> dic = 
    new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)

dic.Add("HeLLo", "HeLLo")
if (dic.ContainsKey("hEllO"))
    dic["hEllO"]
4

1 に答える 1

0

C++ のようにコレクションからキーを取得する方法を実際に見つけることができませんでした (std::maps はキーと値のペアのイテレータを返します)。

トリッキーな作業を行う準備ができている場合は、次のことが可能です: 独自の StringComparer 派生クラスを実装し (もちろん、StringComparer.InvariantCultureIgnoreCase によってすべてを実装できるようにします)、m_key検索前に検索されたキーを使用してメンバーを初期化し、Equals(a,b)メソッド ログを取得します。m_actualKey基本実装が true を返したときにメンバーに比較された値を保持し、それ以外のa場合は保持しませm_keyb

正常に取得された後は、「Equals(a,b)返された 1」イベントが常に 1 つだけ存在するため、実際の値を で見つけることが保証されますm_actualKey。ディクショナリが複数のスレッドから使​​用されている場合は、クエリを同期する必要があることに注意してください。

于 2012-11-03T17:55:41.633 に答える