继承Dictionary(of TKey,TValue)不能不区分大小写

时间:2012-02-06 06:04:56

标签: .net dictionary case-insensitive

拜托,我需要帮助。我有自己的课程:

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

....

End Class

但是,ContainsKey方法区分大小写。我尝试了一切,我需要比较字符串与不区分大小写。我想在线程中改变CurrentCulture,我没有找到。

2 个答案:

答案 0 :(得分: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) {}
}

(并让调用者初始值设定项指定所需的字符串比较器)

答案 1 :(得分: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密钥类型 - 它有点不同寻常地“了解”某个特定密钥类型,但仍然是通用的。

或者,如果你使用合成路线,你可以像往常一样将它传递给构造函数。