如何解决当键为int []时,为什么Dictionary.ContainsKey返回False?
我正在开发某些地图,但是遇到了一个问题。下面是简化的代码。它返回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,但都没有。
解决方法
更改此行:
static Dictionary<int[],Tile> map = new Dictionary<int[],Tile>();
将字典键设为KeyValuePair或ValueTuple而不是int[]
:
static Dictionary<KeyValuePair<int,int>,Tile> map = new Dictionary<KeyValuePair<int,Tile>();
或
static Dictionary<(int x,int y),Tile> map = new Dictionary<(int x,Tile>();
然后在整个代码中使用它。
KeyValuePair和ValueTuple是value types。您可以按照通常的方式检查它们是否相等。 ContainsKey
将按预期工作。
array是C#中的reference type。默认情况下,除非两个数组是同一对象,否则它们将永远彼此相等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。