【问题标题】:How to sort Dictionary with Vector3 keys?如何使用 Vector3 键对字典进行排序?
【发布时间】:2021-01-26 10:43:23
【问题描述】:

我正在从游戏“Rimworld”中重建一个边缘链接系统。

紫色方块是需要形成“链接”的单个方块,在箭头绘制的方向上,具有精确的长度。

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

Dictionary<Vector3Int, bool> linkSquares;

我想对这个字典进行排序,以便首先出现的 KV 对是 Vector3Int.x 最低的那些,然后是 Vector3Int.y 最低的那些。

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

我读过字典无法排序,但我不知道在这种情况下如何使用 SortedDictionary。整个系统似乎过于肮脏,但我不知道我还能如何在这里实现我的目标,因此非常感谢任何设计更改建议。

【问题讨论】:

  • 第一个键是vectorx,第二个键,当vectorx等于时,是vectory吗?
  • 是的,我基本上总是希望最左下角的 Vector3Int 先出现,这样我就可以从它们开始向上或向右形成这些链接,如箭头所示。跨度>

标签: c# sorting dictionary unity3d game-development


【解决方案1】:

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

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

【讨论】:

  • 这确实保证字典按OP期望的顺序排序。在 stackoverflow.com/a/50837837/34092 上查看我的 cmets。
  • 我明白,但我从来没有遇到过这种方式的问题。也许问题存在于大字典...
  • 在另一个线程上阅读我的 cmets。它在今天有效 - 但明确保证有效。 For purposes of enumeration, each item in the dictionary is treated as a KeyValuePair<TKey, TValue> structure representing a value and its key. The order in which the items are returned is undefined. undefined 并不意味着“它不起作用”——所以说这不是问题不是论据。 undefined(在这种情况下)表示“不要依赖它”——您的解决方案特别依赖它
【解决方案2】:

尝试定义一个包含vector3和bool的自定义类,然后从该类中创建对象列表。然后你可以按你想要的方式对类进行排序。

如果您只需要 bool 进行过滤,那么您可以将字典排序到列表中。将字典排序为列表的示例如下:

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

查看thisthis 以获取更多示例代码。

【讨论】:

  • 我会写 kp => kp.Key.x
猜你喜欢
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-20
  • 2013-03-14
相关资源
最近更新 更多