SortedDictionary.TryGetValue()重载

时间:2016-05-29 17:48:52

标签: c# dictionary sorteddictionary

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

班级的一个例子

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;
}

我尝试将EqualsGetHashCode重载到new Key().equals(new Key())返回true的范围。

但是,SortedDictionary.TryGetValue(new Key(), out Value)返回false

2 个答案:

答案 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;

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

Proof of Concept