拜托,我需要帮助。我有自己的课程:
Public Class SerializableDictionary(Of TKey, TValue)
Inherits Dictionary(Of TKey, TValue)
Implements IXmlSerializable
....
End Class
但是,ContainsKey方法区分大小写。我尝试了一切,我需要比较字符串与不区分大小写。我想在线程中改变CurrentCulture,我没有找到。
答案 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
密钥类型 - 它有点不同寻常地“了解”某个特定密钥类型,但仍然是通用的。
或者,如果你使用合成路线,你可以像往常一样将它传递给构造函数。