2012-02-06 41 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密钥类型 - 这将是有点不同寻常的是“知道“关于一种特定的键类型分开,但仍然是通用的。

或者,您可以将它作为正常传递给构造函数,如果使用构图路径。