字典 - 获取已知元素的下一个元素

Dictionary - Getting the next element of a known element

假设我有以下词典:

private IDictionary<string, IPlayer> players;

其中IPlayer是一个定义如下的接口:

public interface IPlayer {
     bool HasTurn { get; set; }
     string Name { get; set; }
}

我正在尝试编写一种方法来找到主动玩家,即轮到的人,轮到它,然后将轮到字典中的下一个玩家。

到目前为止我有这个:

private void NextTurn() {
     if(!playing) return;
     IPlayer actual = players.Values.First(p => p.HasTurn);
     actual.HasTurn = false;
     // How can I get the next player in the dictionary??
}

字典没有正式定义的顺序 - 因此您需要单独的结构来对玩家进行排序。

实际上你可以枚举元素,你会得到 一个 顺序(由于实现细节,它可能一直是相同的顺序) - 所以如果你只需要获取列表字典中的所有玩家 Dictionary.Values 会给你 collection。虽然可以这样定义 "next",但大多数阅读您代码的人都会感到困惑 - 考虑其他数据结构是否能更好地反映您的意图。

正在尝试使用 OrderedDictionary may be an option, but No generic implementation of OrderedDictionary?

一种廉价的方法是将 "next player" 作为玩家的字段(可能使用 name/other 索引作为类型)。

请注意,如果您想确保字典项目的顺序,您需要确保您使用的是 SortedDictionary。然后,您将使用当前项的 Keys 集合和索引通过按索引 + 1.

定位键来移动到 "next" 键

这在很大程度上取决于您接下来如何定义;它是基于标识符(字符串键)吗?如果是这样,那么 SortedDictionary 可能是最好的选择。如果它基于插入顺序,那么 OrderedDictionary 可能是最好的选择。

然后您可以使用字典中的 Keys 集合来确定位置(您也可以遍历键/值对,但我认为这说明了您正在尝试做的最好的事情)。

foreach(var key in dictionary.Keys)
{
    var player = dictionary[key];
    //player does work
    player.HasTurn = false; 
}