首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >元组(或数组)作为C#中的字典键

元组(或数组)作为C#中的字典键
EN

Stack Overflow用户
提问于 2009-06-05 13:56:24
回答 7查看 128.7K关注 0票数 123

我正在尝试用C#制作一个字典查询表。我需要将一个三元组的值解析为一个字符串。我尝试使用数组作为键,但这不起作用,我不知道还能做什么。在这一点上,我正在考虑制作一个字典的字典,但这可能看起来不是很漂亮,尽管这是我在javascript中如何做的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-06-05 14:06:55

如果您使用的是.NET 4.0,请使用元组:

代码语言:javascript
运行
复制
lookup = new Dictionary<Tuple<TypeA, TypeB, TypeC>, string>();

如果没有,您可以定义一个Tuple并将其用作键。元组需要重写GetHashCodeEqualsIEquatable

代码语言:javascript
运行
复制
struct Tuple<T, U, W> : IEquatable<Tuple<T,U,W>>
{
    readonly T first;
    readonly U second;
    readonly W third;

    public Tuple(T first, U second, W third)
    {
        this.first = first;
        this.second = second;
        this.third = third;
    }

    public T First { get { return first; } }
    public U Second { get { return second; } }
    public W Third { get { return third; } }

    public override int GetHashCode()
    {
        return first.GetHashCode() ^ second.GetHashCode() ^ third.GetHashCode();
    }

    public override bool Equals(object obj)
    {
        if (obj == null || GetType() != obj.GetType())
        {
            return false;
        }
        return Equals((Tuple<T, U, W>)obj);
    }

    public bool Equals(Tuple<T, U, W> other)
    {
        return other.first.Equals(first) && other.second.Equals(second) && other.third.Equals(third);
    }
}
票数 123
EN

Stack Overflow用户

发布于 2018-11-15 02:21:43

如果您使用的是C# 7,则应该考虑使用值元组作为组合键。值元组通常比传统的引用元组(Tuple<T1, …>)提供更好的性能,因为值元组是值类型(结构),而不是引用类型,因此它们避免了内存分配和垃圾收集成本。此外,它们提供了更简洁、更直观的语法,如果您愿意的话,可以对它们的字段进行命名。它们还实现了字典所需的IEquatable<T>接口。

代码语言:javascript
运行
复制
var dict = new Dictionary<(int PersonId, int LocationId, int SubjectId), string>();
dict.Add((3, 6, 9), "ABC");
dict.Add((PersonId: 4, LocationId: 9, SubjectId: 10), "XYZ");
var personIds = dict.Keys.Select(k => k.PersonId).Distinct().ToList();
票数 46
EN

Stack Overflow用户

发布于 2009-06-05 14:16:02

如果出于某种原因,您确实希望避免创建自己的元组类或使用内置到.NET 4.0中的元组类,还有一种可能的方法;您可以将这三个键值组合到一个值中。

例如,如果这三个值是不超过64位的整数类型,则可以将它们组合到一个ulong中。

最坏的情况是,你总是可以使用一个字符串,只要你确保其中的三个部分用一些字符或序列分隔,而这些字符或序列不会出现在键的组件中,例如,你可以尝试使用三个数字:

代码语言:javascript
运行
复制
string.Format("{0}#{1}#{2}", key1, key2, key3)

显然,在这种方法中有一些组合开销,但取决于您使用它来做什么,这可能足够微不足道,不需要关心它。

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

https://stackoverflow.com/questions/955982

复制
相关文章

相似问题

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