假设我的字典需要由 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/