为啥当键是 int[] 时 Dictionary.ContainsKey 返回 False? [复制]
Posted
技术标签:
【中文标题】为啥当键是 int[] 时 Dictionary.ContainsKey 返回 False? [复制]【英文标题】:Why is Dictionary.ContainsKey returning False when the key is an int[]? [duplicate]为什么当键是 int[] 时 Dictionary.ContainsKey 返回 False? [复制] 【发布时间】:2021-02-02 03:34:30 【问题描述】:我正在生成一些地图,但遇到了问题。下面是简化的代码。它返回 False 而它应该返回 True。
static Dictionary<int[], Tile> map = new Dictionary<int[], Tile>();
static bool GenerateMap()
for (int y = 0; y < 3; y++)
for (int x = 0; x < 3; x++)
Tile tile;
int[] i = x, y;
if(map.ContainsKey(i))
tile = map[i];
Console.WriteLine("Contains!");
else
tile = new Tile();
tile.Generate();
map.Add(i, tile);
int[] z = 0,0;
if (map.ContainsKey(z)) return true;
return false;
我尝试过 Dictionary.TryGetValue() 和 Try / Catch,但都没有成功。
【问题讨论】:
数组是引用对象,这意味着除非它们覆盖Equals
,否则将使用默认的Object.Equals
,它认为两个对象只有在它们实际上是同一个对象时才相等。包含数字 2 的两个数组不相等
【参考方案1】:
改变这一行:
static Dictionary<int[], Tile> map = new Dictionary<int[], Tile>();
将字典键设为KeyValuePair 或ValueTuple 而不是int[]
:
static Dictionary<KeyValuePair<int, int>, Tile> map = new Dictionary<KeyValuePair<int, int>, Tile>();
或
static Dictionary<(int x, int y), Tile> map = new Dictionary<(int x, int y), Tile>();
然后在整个代码中使用它。
KeyValuePairs 和 ValueTuples 是 value types。您可以通过通常的方式检查这些是否相等。 ContainsKey
将按预期工作。
array 在 C# 中是 reference type。默认情况下,除非它们是同一个对象,否则不会有 2 个数组彼此相等。
【讨论】:
以上是关于为啥当键是 int[] 时 Dictionary.ContainsKey 返回 False? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
当键是一个只知道第一个元素的元组时,如何获取scala Map值?
当键看起来像一个 int 时如何访问 NSMutableDictionary?
为啥我不能用字符串为 Dictionary<String, Int> 下标?