如何使用 Vector3 键对字典进行排序?

How to sort Dictionary with Vector3 keys?

我正在从游戏“Rimworld”中重新创建一个 edge-link 系统。

紫色方块是需要形成“links”的独立方块,在箭头绘制的方向上,具有准确的长度。

目前,我不知道如何比将所有这些方块放在字典中更好,在字典中我标记方块的位置及其方向(可以是向上或向右),如下所示:

Dictionary<Vector3Int, bool> linkSquares;

我想对这本字典进行排序,以便排在前面的 KV 对是 Vector3Int.x 最低的 KV 对,然后是 Vector3Int.y 最低的 KV 对。

那样的话,我总是可以从那些方块(图片上标有数字 1-4)开始,然后沿着适当的箭头方向前进,边走边移除那些方块,这样只会留下其他起始方块。

我了解到字典无法排序,但我不知道如何在这种情况下使用 SortedDictionary。整个系统看起来太脏了,但我不知道我还能在这里实现我的目标,所以非常感谢任何设计更改建议。

尝试定义一个包含 vector3 和 bool 的自定义 class,然后根据该 class 制作对象列表。然后你可以对 class 进行任意排序。

如果您只需要用于过滤的布尔值,那么您可以将字典排序到列表中。字典排序成列表的例子如下:

List<Vector3Int> productList = myDictionary.OrderBy(kp => kp.key.x).ThenBy(kp => kp.key.y)
                                      .ToList();

检查 this, and this 以获取更多示例代码。

您可以对第一个键使用 OrderBy,对第二个键使用 ThenBy (Linq),并将结果放入新字典(已排序):

        var dictsorted= linkSquares.OrderBy(k => k.Key.x).ThenBy(k => k.Key.y).ToDictionary(k => k.Key, k=> k.Value);