c# - 多部分 int 字典键的最佳方法?

标签 c# .net dictionary key

假设我的字典需要由 ItemId 和 RegionId 的组合作为键,都是 int。并说值(value)方的类型是“数据”。 我可以通过几种方式做到这一点:

方式一:多级字典,像这样:

Dictionary<int, Dictionary<int, Data>>  myData;

所以查找可以这样编码:

Data data1  = myData[itemId][regionId];

不错,但缺点是我需要在第一级检查 key 是否存在,因此更安全的代码是

Data data1 = null;
if (myData.ContainsKey(itemId)) data1 =  myData[itemId][regionId];

方式 2:使用多部分 key 。 在这种方法中,我将创建一个结构来表示部件,并使用一个结构作为字典键:

private struct MultiPartKey
{
    public int ItemId;
    public int RegionId;
}

Dictionary<MultiPartKey, Data>  myData;

查找就像这样:

MultiPartKey mpk;
mpk.ItemId = itemId;
mpk.RegionId = regionId;
Data data1 = myData[mpk];

这里可能存在的缺点是,它仅在我的结构完全由简单值类型组成时才有效,因此两个实例的按位比较将相等。 (对吗?)

你怎么看?

最佳答案

与其让你的结构像那样“愚蠢”(并且可变),不如让它不可变并给它适当的相等方法,例如

private struct MultiPartKey : IEquatable<MultiPartKey>
{
    private readonly int itemId;
    private readonly int regionId;

    public int ItemId { get { return itemId; } }
    public int RegionId { get { return regionId; } }

    public MultiPartKey(int itemId, int regionId)
    {
        this.itemId = itemId;
        this.regionId = regionId;
    }

    public override int GetHashCode()
    {
        int hash = 17;
        hash = hash * 31 + itemId;
        hash = hash * 31 + regionId;
        return hash;
    }

    public override bool Equals(object other)
    {
        return other is MultiPartKey ? Equals((MultiPartKey)other) : false;
    }

    public bool Equals(MultiPartKey other)
    {
        return itemId == other.itemId &&
               regionId == other.regionId;
    }
}

您可以扩展它以使用您想要的任何类型,只要您正确实现相等性和哈希码即可。实现 IEquatable<MultiPartKey>意味着字典不需要将键装箱来进行比较。

使用这种方法而不是 Dictionary<int, Dictionary<int, Data>> 的缺点是您无法轻松找到给定项目 ID 的所有条目。

关于c# - 多部分 int 字典键的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4974509/

相关文章:

c# - c#中的sql查询

c# - SqlDataReader.GetString 和 sqlnullvalueException

c# - 在 Task.Run 中使用 CancellationToken 超时不起作用

java - 使用 json 字符串创建 java map

javascript - 如何正确扩展 ES6 Map

c# - 内存样本中的Naudio回放会产生声音的延迟和不美观的间隙

c# - 使用 JavaScript 为 MVC 应用构建相对 URL

c# - 如何将 WorkItemCollection 转换为列表

.net - 了解 ONION 和 N 层架构之间的区别

python - 查找具有不同键的 2 个字典列表之间的不同值