Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 字典-获取已知元素的下一个元素_C#_.net_List_Dictionary - Fatal编程技术网

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

C# 字典-获取已知元素的下一个元素,c#,.net,list,dictionary,C#,.net,List,Dictionary,假设我有以下词典: private IDictionary<string, IPlayer> players; 我正在尝试编写一个方法,找到活动玩家,即拥有轮次的玩家,进行轮次,然后将轮次交给字典中的下一个玩家 到目前为止,我有: private void NextTurn() { if(!playing) return; IPlayer actual = players.Values.First(p => p.HasTurn); actual.

假设我有以下词典:

private IDictionary<string, IPlayer> players;
我正在尝试编写一个方法,找到活动玩家,即拥有轮次的玩家,进行轮次,然后将轮次交给字典中的下一个玩家

到目前为止,我有:

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 regular
dictionary中获取所有参与者的列表。值将为您提供集合。虽然有可能定义“下一步”这样的方式,但是大多数阅读代码的人会感到困惑——考虑其他数据结构是否更好地反映了你的意图。
尝试使用可能是一种选择,但是


一种廉价的方法是将“下一个玩家”作为玩家的字段(可能使用名称/其他索引作为类型)。

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

事实上,您可以枚举元素并获得一个顺序(由于实现细节的原因,可能一直都是相同的顺序)-因此,如果需要,只需在dictionary regular
dictionary中获取所有参与者的列表。值将为您提供集合。虽然有可能定义“下一步”这样的方式,但是大多数阅读代码的人会感到困惑——考虑其他数据结构是否更好地反映了你的意图。
尝试使用可能是一种选择,但是


一种廉价的方法是将“next player”作为播放器的字段(可能将name/other index作为类型)。

如果要确保字典项的顺序,需要确保使用的是SortedDictionary。然后,您可以使用当前项的键集合和索引,通过索引+1定位键来转到“下一个”键。

如果要确保字典项的顺序,请务必确保使用的是SortedDictionary。然后,您将使用当前项的键集合和索引,通过按索引+1定位键来移动到“下一个”键。

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

然后,您可以使用字典中的Keys集合来确定位置(您也可以查看key/value对,但我认为这说明了您正在努力做到最好)


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

然后,您可以使用字典中的Keys集合来确定位置(您也可以查看key/value对,但我认为这说明了您正在努力做到最好)


字典
没有指定任何顺序,因此这里没有下一个播放器。字典中没有“下一个”的概念-它在逻辑上是无序的。如果你想要一个特定的顺序,你应该使用不同的集合类型。@MatiCicero:仅仅因为你可以迭代它,并不意味着它是有顺序的。把属性TurnNumber添加到你的界面上怎么样?我想你真的需要弄清楚你在这里想要实现什么。我不知道哪种(基于回合的)游戏没有明确的轮流顺序。你似乎需要一个有序的列表,这样你就不会把一个回合交给一个已经回合的玩家。也许你根本不需要一本字典,但最好是有一个
列表
?或者如果你真的需要字典,很可能两者都有。
字典
没有指定任何顺序,因此这里没有下一个播放器。字典中没有“下一个”的概念-它在逻辑上是无序的。如果你想要一个特定的顺序,你应该使用不同的集合类型。@MatiCicero:仅仅因为你可以迭代它,并不意味着它是有顺序的。把属性TurnNumber添加到你的界面上怎么样?我想你真的需要弄清楚你在这里想要实现什么。我不知道哪种(基于回合的)游戏没有明确的轮流顺序。你似乎需要一个有序的列表,这样你就不会把一个回合交给一个已经回合的玩家。也许你根本不需要一本字典,但最好是有一个
列表
?或者如果你真的需要这本词典,两本都有可能。
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??
}
foreach(var key in dictionary.Keys)
{
    var player = dictionary[key];
    //player does work
    player.HasTurn = false; 
}