2012-02-06 79 views
2

請,我需要幫助。我有我自己的類:繼承字典(的TKey,TValue)不能不區分大小寫

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

.... 

End Class 

但是,ContainsKey方法是區分大小寫的。我嘗試了一切,我需要比較字符串不區分大小寫。我認爲改變CurrentCulture在線程中,我沒有找到如何。

回答

4

如果您使用區分大小寫的比較器,則僅區分大小寫。你需要傳遞一個不敏感的比較器給基礎構造器。在C#中,這將是這樣的:

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; 
    } 
} 

,或者更好IMO,讓來電者決定:

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

(並有來電初始化指定字符串比較器所需的)

+0

謝謝馬克:你讓我的夜晚更快樂! – 2012-02-06 06:49:41

+0

@DamiánHerrera我非常喜歡第二個版本,注意 - 更少的驚喜! – 2012-02-06 07:01:22

1

Dictionary(Of TKey, TValue)繼承通常是錯誤的事情 - 它通常是更好地組成的集合,而不是繼承從它。

但是,您基本上需要確保字典使用不區分大小寫的比較器 - 通過將類似StringComparer.OrdinalIgnoreCase的東西傳遞到適當的constructor overload for Dictionary中來完成。仔細想想你想要進行比較的文化,如果有的話。

您可以通過編寫它調用MyBase.New(StringComparer.OrdinalIgnoreCase)構造做到這一點無論是在現有的類:

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

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

End Class 

注意,固定它使用string密鑰類型 - 這將是有點不同尋常的是「知道「關於一種特定的鍵類型分開,但仍然是通用的。

或者,您可以將它作爲正常傳遞給構造函數,如果使用構圖路徑。