字典 - 获取已知元素的下一个元素
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;
}
假设我有以下词典:
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;
}