17

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

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

ライブラリとの主なやり取りは、文字列でキー設定された HashTable を介して行われ、そのキーの情報のオブジェクト グラフを返します。

問題は、キーが明らかに大文字と小文字を区別することですが、ユーザーのブラウザから取得したものは必ずしも大文字と小文字が一致するとは限りません... (キーは完全に小文字になっていることがよくあります)

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

例えば

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

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

この機能を追加するために会社にサポート チケットを提出できる可能性が低い場合、この機能をサポートする他の DataStructures (つまり、新しいジェネリック コレクション/ディクショナリ) はありますか?

string最後に、System.String GetHashCode () メソッドをオーバーライドして、大文字と小文字を区別しないすべての文字列が同じハッシュコードを返すようにすることは可能でしょうか?

誰か提案があれば乾杯

4

4 に答える 4

31

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

2.0、3.0、3.5用

Hashtable ht = new Hashtable(StringComparer.InvariantCultureIgnoreCase);

このSO リンクで InvariantCultureIgnoreCase と OrdinalIgnoreCase に関する情報を取得できます

また

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

大文字と小文字を区別しないディクショナリ コレクションはよく使用されるため、.NET Framework には、大文字と小文字を区別しない Hashtable オブジェクトと SortedList オブジェクトの作成をサポートする CollectionUtil クラスがあります。CreateCaseInsensitiveHashtable または CreateCaseInsensitiveSortedList を呼び出して使用します。

.Net 1.0 の場合 (1.0 が StringComparer をサポートしているかどうかはわかりません)

public class InsensitiveComparer : IEqualityComparer
{
    CaseInsensitiveComparer _comparer = new CaseInsensitiveComparer();
    public int GetHashCode(object obj)
    {
        return obj.ToString().ToLowerInvariant().GetHashCode();
    }

    public new bool Equals(object x, object y)
    {
        if (_comparer.Compare(x, y) == 0)
        {
            return true;
        }

        else
       {
           return false;
       }
    }
}

Hashtable dehash = new Hashtable(new InsensitiveComparer());
于 2009-05-13T09:49:01.200 に答える
17

辞書付き:

new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);

しかし、もっと単純に、StringDictionary大文字と小文字を区別しないと思います。

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

    string result1 = ht["MyKey"];
    string result2 = ht["MYKEY"];
    string result3 = ht["mykey"];
于 2009-05-13T09:39:22.743 に答える
2

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

コードからハッシュテーブルに入力すると、挿入時にキーを正規化し、正規化されたキーを再度取得できます。

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

于 2009-05-13T09:39:32.587 に答える
1

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

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

StringDictionary dict = new StringDictionary();

foreach(string key in ht.Keys)
    dict.Add(key, ht[key].ToString());

string result = dict["foo"]; // Assigns "bar" to result
于 2009-05-13T10:16:47.707 に答える