2012-02-06 7 views
2

お願いします。 ContainsKeyメソッドは、大文字と小文字が区別され、(TKey、TValueの)Inherits Dictionaryは大文字と小文字を区別することはできません

Public Class SerializableDictionary(Of TKey, TValue) 
    Inherits Dictionary(Of TKey, TValue) 
    Implements IXmlSerializable 

.... 

End Class 

しかし:私は自分のクラスを持っています。私はすべてを試して、私は大文字小文字を区別しない文字列を比較する必要があります私は、スレッドでCurrentCultureを変更すると思う、私は方法が見つかりません。 Dictionary(Of TKey, TValue)から継承

答えて

4

大文字と小文字を区別する比較機能を使用する場合は、大文字と小文字が区別されます。あなたは無関係の比較演算子をベースコンストラクタに渡す必要があります。 IMO、呼び出し側が決めさせ

public class SerializableDictionay<TKey, TValue> 
    : Dictionary<TKey,TValue>, IXmlSerializable 
{ 
    public SerializableDictionay() : base(GetComparer()) { } 

    static IEqualityComparer<TKey> GetComparer() { 
     if(typeof(TKey) == typeof(string)) { 
      // just one of the possibilities 
      return (IEqualityComparer<TKey>)(object) 
        StringComparer.InvariantCultureIgnoreCase; 
     } 
     return EqualityComparer<TKey>.Default; 
    } 
} 

または、ずっと良く:

public class SerializableDictionay<TKey, TValue> 
    : Dictionary<TKey,TValue>, IXmlSerializable 
{ 
    public SerializableDictionay() : base() {} 
    public SerializableDictionay(IEqualityComparer<TKey> comparer) 
       : base(comparer) {} 
} 

(及び発信者の初期化子は、目的の文字列-比較子を指定する必要があり)

C#では、このようなものになります
+0

ありがとうMarc:Dあなたは私の夜を幸せにしました! –

+0

@DamiánHerrera私は徹底的に最初の2番目のバージョンを好む、メモ - 少ない驚き! –

1

は通常行うには間違ったことである - それはそれから継承よりもコレクションを構成する通常の方が良いでしょう。

しかし、基本的に辞書では大文字と小文字を区別しない比較機能が使用されていることを確認する必要があります。StringComparer.OrdinalIgnoreCaseなどを適切なconstructor overload for Dictionaryに渡します。ある場合は比較を実行する文化を慎重に考えてください。

あなたはMyBase.New(StringComparer.OrdinalIgnoreCase)を呼び出すコンストラクタ書き込むことにより、いずれかの既存のクラスでこれを行うことができます:stringキータイプを使用するように固定することを

Public Class SerializableDictionary(Of TValue) 
    Inherits Dictionary(Of String, TValue) 
    Implements IXmlSerializable 

    Public Sub New() 
     MyBase.New(StringComparer.OrdinalIgnoreCase) 
    End Sub 

End Class 

注意を - それは「知ることが少し変わっただろう1つの特定のキータイプについて別々に扱いますが、依然として一般的です。

または、コンポジションルートを使用する場合は、通常通りコンストラクタに渡すことができます。

関連する問題