SortedDictionary.TryGetValue() 重载

SortedDictionary.TryGetValue() Overloads

我有一个使用自定义键结构的排序字典。为了方便排序,我在key里面有一些变量不想参与相等比较

class

的例子
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;
}

我已经尝试重载 EqualsGetHashCodenew Key().equals(new Key()) returns 正确的程度。

然而,SortedDictionary.TryGetValue(new Key(), out Value) returns false

排序的实现未使用您实现的方法。相反,您需要在 struct:

中实现 IComparable<T> 接口
public struct Key : IComparable<Key> 
{
    public int CompareTo(Key other)
    {
        return Comparer.Default<string>.Compare(otherSortingVariable, other.otherSortingVariable);
    }
}

或自定义 class 实现 IComparer<T> 接口:

public class KeyComparer : Comparer<Key>
{
    public override int Compare(Key x, Key y)
    {
        return Comparer.Default<string>.Compare(x.otherSortingVariable, y.otherSortingVariable);
    }
}

并将上述 class 的实例传递给接受自定义比较器的 SortedDictionary 构造函数 overload

由于您的 SortedDictionary 完全忽略了您所做的覆盖并使用 IComparable 接口来确定相等性 (see this secion),因此您不能使用 TryGetValue。但是,您可以将 Equals 方法与 Linq 一起使用:

res = dict.Single(kvp => kvp.Key.Equals(comperativeKey)).Value;

不幸的是,您以这种方式失去了所有性能提升,因此如果这是一个问题,您可能需要实现自己的自定义词典。

Proof of Concept