17


3

ハッシュキー/辞書と文字列キーの併用

これが可能かどうか疑問に思う。

ユーザーに関する識別情報を含むサードパーティのライブラリがあります。

ライブラリとの主なやりとりは、文字列でキー入力されたHashTableを介したもので、そのキーに関する情報のオブジェクトグラフを返します。

問題は、キーは明らかに大文字と小文字を区別することですが、ユーザーのブラウザから得られるものは必ずしも大文字と小文字を区別しません…​ (私たちはしばしばキーを完全に小文字にします)

ハッシュテーブルに対して大文字と小文字を区別しないキー検索を実行できるかどうかは疑問に思います

e.g.

Hashtable ht = new Hashtable();
ht.Add("MyKey", "Details");

string result = ht["MyKey"];
string result = ht["MYKEY"];
string result = ht["mykey"];

万が一、この機能を追加するためにサポートチケットを会社に送信することができましたが、他にDataStructureがありますか。 この機能をサポートする新しい総称コレクション/辞書)

最後に、大文字と小文字を区別しないすべての文字列が同じハッシュコードを返すようにするために、System.String GetHashCode()メソッドをオーバーライドすることが可能です。 e.g. `string`は封印されたクラスなので、これは絶対にお勧めできません。

誰かが何か提案があれば歓声を上げます

4 Answer


31


ハッシュテーブル比較で大文字と小文字が区別されないようにするコード

2.0、3.0、3.5の場合

Hashtable ht = new Hashtable(StringComparer.InvariantCultureIgnoreCase);

InvariantCultureIgnoreCase vs.についての情報を得ることができます。 この SOリンクのOrdinalIgnoreCase

または

Hashtable ht = System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable();

大文字と小文字を区別しない辞書コレクションはそのような一般的な用途であるため、 .NET Framework has a CollectionUtil class that supports creating 大文字と小文字を区別しないHashtableオブジェクトとSortedListオブジェクト。 CreateCaseInsensitiveHashtableまたはCreateCaseInsensitiveSortedListを呼び出して使用します。

Net 1.0の場合(1.0がStringComparerをサポートしているかどうかはわかりません)
パブリッククラスInsensitiveComparer:IEqualityComparer {CaseInsensitiveComparer _comparer = new CaseInsensitiveComparer(); public int GetHashCode(object obj){return obj.ToString()。ToLowerInvariant()。GetHashCode();}を返します。 }

public new bool(オブジェクトx、オブジェクトy)に等しい{if(_comparer.Compare(x、y)== 0){trueを返す。 }

それ以外の場合はfalseを返します。 }}}

Hashtable dehash = new Hashtable(new InsensitiveComparer());


17


辞書を使って:

new Dictionary(StringComparer.OrdinalIgnoreCase);

しかし、より単純な、私は `+ StringDictionary +`も大文字と小文字を区別しないと信じています:

    StringDictionary ht = new StringDictionary();
    ht.Add("MyKey", "Details");

    string result1 = ht["MyKey"];
    string result2 = ht["MYKEY"];
    string result3 = ht["mykey"];


2


大文字と小文字を区別しない `+ IEqualityComparer `を ` HashTable `コンストラクターに指定できますが、これにはサードパーティライブラリの ` HashTable +`構造に影響を与えることが必要です。

コードからハッシュテーブルを埋める場合は、挿入時にキーを正規化し、正規化されたキーをもう一度取得することができます。

ハッシュテーブルの内容に影響を与えることができなくても、キーの構造を知っている場合は、ハッシュテーブルにアクセスする前にユーザー入力を修正できます。


1


これはあまり効率的な方法ではありませんが、いつでもハッシュテーブルを取得してそこからStringDictionaryを作ることができます。

Hashtable ht = new Hashtable(); ht.Add( "FOO"、 "bar");

StringDictionary dict = new StringDictionary();

foreach(ht.Keysの文字列キー)dict.Add(key、ht [key] .ToString());

string result = dict ["foo"]; //結果に "bar"を割り当てます