假设我有以下词典:
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??
}
答案 0 :(得分:4)
字典没有正式定义的顺序 - 所以你需要单独的结构来命令玩家。
确实你可以枚举元素,你会得到一个命令(由于实现细节,它可能会一直是相同的顺序) - 所以如果你需要获取字典中所有玩家的列表常规Dictionary.Values
将为您提供收藏。虽然可以定义&#34; next&#34;这样,大多数阅读代码的人都会感到困惑 - 考虑其他数据结构是否能更好地反映您的意图。
尝试使用OrderedDictionary可能是一种选择,但No generic implementation of OrderedDictionary?
一个便宜的方法是让下一个玩家&#34;作为玩家的领域(可能以名称/其他索引作为类型)。
答案 1 :(得分:2)
要小心,如果您想确保您需要确保使用SortedDictionary的字典项目的顺序。然后,您将使用Keys集合和当前项目的索引继续前进到&#34; next&#34;通过索引+ 1来定位键。
答案 2 :(得分:0)
这在很大程度上取决于你接下来的定义;它是基于标识符(字符串键)?如果是这样,那么SortedDictionary可能是最好的选择。如果它基于插入顺序,那么OrderedDictionary可能是最好的选择。
然后,您可以使用字典中的Keys集合来确定位置(您也可以通过键/值对,但我认为这说明了您尝试做的最好的事情)。
foreach(var key in dictionary.Keys)
{
var player = dictionary[key];
//player does work
player.HasTurn = false;
}