首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SortedDictionary.TryGetValue()过载

SortedDictionary.TryGetValue()过载
EN

Stack Overflow用户
提问于 2016-05-29 17:48:51
回答 2查看 488关注 0票数 0

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

类的一个例子

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-29 18:05:00

您实现的方法不被排序的实现所使用。相反,您需要在IComparable中实现struct接口。

代码语言:javascript
复制
public struct Key : IComparable<Key> 
{
    public int CompareTo(Key other)
    {
        return Comparer.Default<string>.Compare(otherSortingVariable, other.otherSortingVariable);
    }
}

或者实现IComparer接口的自定义类:

代码语言:javascript
复制
public class KeyComparer : Comparer<Key>
{
    public override int Compare(Key x, Key y)
    {
        return Comparer.Default<string>.Compare(x.otherSortingVariable, y.otherSortingVariable);
    }
}

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

票数 2
EN

Stack Overflow用户

发布于 2016-05-29 18:37:47

因为您的SortedDictionary完全忽略了您所做的重写,并且使用IComparable接口来确定相等性(看这个塞西翁),所以不能使用TryGetValue。但是,可以在Linq中使用您的Equals方法:

代码语言:javascript
复制
res = dict.Single(kvp => kvp.Key.Equals(comperativeKey)).Value;

不幸的是,您以这种方式丢失了所有性能增益,因此如果这是一个问题,您可能希望实现您自己的自定义字典。

概念证明

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37513033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档