2009-05-13 27 views
17

これが可能かどうかわかりません。 文字列キーと大文字小文字を区別しないハッシュテーブル/辞書を使用しています。

我々は、ユーザーの識別情報が含まれているサードパーティのライブラリを持っている

...

ライブラリーとの主な相互作用は、文字列とキーが付いてハッシュテーブルを介して行われ、そしてそのキーのための情報のオブジェクトグラフを返します。 。

問題がある

、キーは明らかに大文字と小文字が区別されますが、私たちは必ずしもそうと一致していないユーザーのブラウザから何を得る...私は「

(私たちは、多くの場合、完全にlowercase'dキーを取得します)大文字小文字を区別することが可能かどうか疑問に思っています。

私たちは、この機能を追加するために会社にサポートチケットを提出する可能性がオフのチャンスで

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

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

、この機能

最後をサポートする他のデータ構造(すなわち、新たなジェネリックコレクション/辞書が)がある、だろうSystem.String GetHashCode()メソッドをオーバーライドして にすることができます。すべての大文字と小文字を区別しない文字列が同じハッシュコードを返すようにします。

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

が、シンプルな、私はStringDictionaryが大文字と小文字を区別しないと考えている:私は誰が辞書を持つ任意の提案

+4

脇に:もしあなたが.NET 3.5を使用しているのであれば、おそらくHashtableなどの使用をやめて、代わりにジェネリックコレクションを使い始めるべきです。 –

+0

あなたのコメントをお寄せください:おそらく、すべてのキーで.ToLowerInvariant()を呼び出してください。 –

+0

*スクラッチヘッド*しかし、ハッシュテーブル内のキーはToLowered()ではありません。私。私はインスタンス化されているか、またはdllの内部に埋め込まれた、あらかじめ構築されたハッシュテーブルを与えられています。 HTのキーは大文字と小文字を区別しています...私がdllに持っている唯一のアクセスは、getter/indexerを使ってキーを渡すことです。たとえ私が外に私のキーを置き換えたとしても、その中。 –

答えて

30

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

2.0の場合を作るために、3.0、3.5

Hashtable ht = new Hashtable(StringComparer.InvariantCultureIgnoreCase); 

あなたはSO

OR

をリンク thisにOrdinalIgnoreCase対InvariantCultureIgnoreCase上の情報を取得することができます
Hashtable ht = System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable(); 

case-insensi .NET Frameworkには、大文字と小文字を区別しないHashtableオブジェクトとSortedListオブジェクトの作成をサポートするCollectionUtilクラスが用意されています。 CreateCaseInsensitiveHashtableまたはCreateCaseInsensitiveSortedListを呼び出して使用します。

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()); 
+1

StringComparerクラスは、大文字と小文字を区別しない比較機能を提供しています。 –

+0

Danielに感謝します。私は自分の反応を編集した。 –

+0

これはちょうど参考です:私はStringDictionaryキーがデフォルトで大文字小文字を区別しないことを知った。しかし、キーと値の両方が文字列でなければなりません。 –

17

を持っている場合stringは密閉されたクラスである

乾杯として、これは何の常連客ではないと思っていますあまりに:

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

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

乾杯。 IEqualityOperatorのオーバーロードを指摘して他の人に感謝します...残念ながら、私はライブラリの内部やHashtableの構築にアクセスできませんでした...私はReflectorを使って実装を発見しました。 。私は会社と一緒にサポートチケットを記録し、 "Feature"として追加できるかどうか質問します。 –

2

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

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

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

1

これは非常に効率的な方法ではありませんが、あなたは常にそれからStringDictionaryをハッシュテーブルを取得して作ることができるの.Net 1.0の場合

(1.0 StringComparerをサポートしている場合、私はわからない):

+1

+1これはいい考えです。 (ただし、ハッシュテーブルの "FOO"と "foo"に失敗します) –

+0

Addメソッドの代わりにインデクサーを使用すると、例外が発生しなくなり、元のHashtableに複数のケースごとに異なるキーのみ? – Rytmis

関連する問題