Dictionary - 获取已知元素的下一个元素

时间:2015-01-22 19:26:43

标签: c# .net list dictionary

假设我有以下词典:

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??
}

3 个答案:

答案 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; 
}