【问题标题】:Dictionary - Getting the next element of a known element字典 - 获取已知元素的下一个元素
【发布时间】:2015-01-22 19:26:43
【问题描述】:

假设我有以下字典:

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 没有指定任何顺序,所以这里没有下一个玩家这样的东西。
  • 字典中没有“下一个”的概念——它在逻辑上是无序的。如果你想要一个特定的订单,你应该使用不同的集合类型。
  • @MatiCicero:仅仅因为你可以迭代它,并不意味着它是有序的。
  • 把属性 TurnNumber 添加到你的界面怎么样?
  • 我认为您确实需要澄清您在这里实际想要实现的目标。我不知道哪种(回合制)游戏没有明确的轮流顺序。你似乎需要一个有序的列表,这样你就不会让已经转弯的玩家回头。也许您根本不需要字典,但最好使用List&lt;IPlayer&gt;?或者如果你真的需要字典,那么两者都有。

标签: c# .net list dictionary


【解决方案1】:

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

确实,您可以枚举元素并且您将获得 一个 顺序(由于实施细节,它可能一直是相同的顺序) - 所以如果您只需要获取字典中所有玩家的列表普通的Dictionary.Values 会给你收藏。虽然可以通过这种方式定义“下一个”,但大多数阅读您的代码的人会感到困惑 - 考虑一下其他数据结构是否能更好地反映您的意图。

尝试使用OrderedDictionary 可能是一种选择,但No generic implementation of OrderedDictionary?

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-02-11
        • 2020-08-11
        • 2018-10-10
        • 2012-12-08
        • 2010-11-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-19
        相关资源
        最近更新 更多