我有一个使用自定义键结构的排序字典。为了便于排序,我在密钥中有一些变量,我不想参与相等比较。
班级的一个例子
public struct Key
{
//Needs to participate in equality comparison for SortedDictionary.TryGetValue();
public int intKey;
public object objectKey;
//Needs to be ignored in SortedDictionary.TryGetValue();
public int sortingVariable;
public string otherSortingVariable;
}
我尝试将Equals
和GetHashCode
重载到new Key().equals(new Key())
返回true的范围。
但是,SortedDictionary.TryGetValue(new Key(), out Value)
返回false
答案 0 :(得分:2)
您实现的方法不会被排序实现使用。相反,您需要在struct
:
IComparable<T>
界面
public struct Key : IComparable<Key>
{
public int CompareTo(Key other)
{
return Comparer.Default<string>.Compare(otherSortingVariable, other.otherSortingVariable);
}
}
或实现IComparer<T>
接口的自定义类:
public class KeyComparer : Comparer<Key>
{
public override int Compare(Key x, Key y)
{
return Comparer.Default<string>.Compare(x.otherSortingVariable, y.otherSortingVariable);
}
}
并将上述类的实例传递给接受自定义比较器的SortedDictionary
构造函数overload。
答案 1 :(得分:1)
由于您的SortedDictionary
完全忽略了您所做的覆盖并使用IComparable
界面来确定相等(see this secion),因此您无法使用TryGetValue
。但是,您可以使用Linq的Equals
方法:
res = dict.Single(kvp => kvp.Key.Equals(comperativeKey)).Value;
不幸的是,您通过这种方式失去了所有性能提升,因此如果这是一个问题,您可能希望实现自己的自定义词典。