如何检查2D数组中是否存在键值对?

4
我有一个二维数组或结构体。
public struct MapCell
{
    public string tile;
}

public MapCell[,] worldMap;

但是没有办法检查这个数组中是否存在密钥对...没有相关的方法可用。

我尝试像这样做

if (worldMap[tileX, tileY] != null) {
}

它不起作用:

Error 1 Operator '!=' cannot be applied to operands of type 'Warudo.MapCell' and '<null>'

并且为了

if (worldMap[tileX, tileY].tile != null) {

它也无法工作(当它遇到不存在的元素时,异常会弹出)。

Index was outside the bounds of the array.

那么,我该如何检查密钥对是否存在呢?

1
你必须使用数组吗?也许像Dictionary<T>这样的集合类会为你提供所需的功能。 - FishBasketGordo
@FishBasketGordo 嗯,它可以用作二维数组吗?那么它会提供检查方法吗? - NewProger
而且你为什么要使用结构体? 可变结构体是个坏主意... 我可能会建议在这里使用类(class)。 - Reed Copsey
1
我认为你没有因为不存在的元素而得到异常。你是如何初始化worldMap的?你发布的代码不应该抛出异常,除非你没有初始化worldMap或者你试图访问数组超出边界的索引,但是你的if条件应该总是为真,因为一个struct永远不可能等于null - Steven Oxley
@Lurler -1 目前,我认为这个问题非常误导人。请更新您的问题,包括您遇到的实际错误以及您对worldMap进行的任何初始化/操作。 - Steven Oxley
@Steven Oxley,我更新了问题。 - NewProger
2个回答

7
您没有提到您遇到的错误类型--是数组越界还是空引用。如果您遇到数组越界的情况,您应该在空引用检查之前添加类似以下内容的代码...
// make sure we're not referencing cells out of bounds of the array
if (tileX < arr.GetLength(0) && tileY < arr.GetLength(1))
{
    // logic
}

当然,最好的方法是仅存储最大数组边界而不是每次获取它们的长度。
我也赞同使用类而不是结构体的建议。
编辑:你有没有初始化这个字段?你没有在代码示例中包含它。例如worldMap = new MapCell[100,100];,然后填充数组...

我当然会初始化它。我以为不必包含这个部分。 - NewProger
通常最好包括与问题有关的所有内容。有时问题出现在你意想不到的地方,每个人都会遇到这种情况 :) - Chris Walsh
您可以编辑上面的问题以包含声明,这可能有助于我们进一步帮助您。 - Chris Walsh
还有,是的,它有效 :) 谢谢 :) 更新:不,你的回答已经满足了需求。 - NewProger
@Lurler 嗯,你可以简单地编辑这个问题并添加缺少的细节,而不是让我们在黑暗中摸索。更新:请考虑更新您的问题,以便后来阅读它的人知道问题所在。不要因错误而感到羞耻。^^ - Martin Hennings
好的,我按照您说的做了 :) 我认为如果有人需要找到这个或类似问题的答案,这样可能更清晰明了。 - NewProger

-2
如果您正在使用结构值数组,则它们始终存在(一旦构建数组),但在设置它们之前具有默认值。
我建议在这里使用类而不是结构。这将允许您检查null,并且如果您要更改值(根据名称,我期望会这样做...),则可以更符合预期地进行操作。
话虽如此,您仍然可以检查结构中的字符串是否为null:
if (worldMap[tileX, tileY].tile != null)
{
    // You've set the "tile" field inside of this "cell"...

这个代码之所以可行,是因为结构体的默认值会将所有的引用类型(包括字符串)都初始化为 null。


不,tile并不一定为空,但是数组可能为空。比如说,如果tileX = 10,那么它会弹出异常,表示该键不存在。 - NewProger
@Lurler 请复制粘贴您收到的确切错误文本。我不明白为什么会出现“键不存在”的错误。通常会看到“索引超出了数组界限”的错误。 - Steven Oxley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接