【问题标题】:Comparing an int against multiple int arrays in C#在 C# 中将一个 int 与多个 int 数组进行比较
【发布时间】:2015-01-11 05:03:56
【问题描述】:

假设我有一个名为 mapId 的整数和一个由地图编号组成的三个 int 数组的集合。根据用户所在的地图,会生成一个项目。对于此示例,我们可以将三个项目称为:common_itemuncommon_itemrare_item

int mapId;

int[] easyMaps = { 7, 10, 3, 44 };
int[] mediumMaps = { 17, 14, 32, 11, 79, 80, 82, 90, 111 };
int[] hardMaps = { 92, 98, 112, 145 };

我想做的是:
如果玩家在简单地图上,则生成:common_item
如果玩家在中等难度地图上,则生成:uncommon_itemcommon_item
如果玩家在硬地图上,则生成:rare_itemuncommon_itemcommon_item

如果不编写三个单独的 for 循环并分别遍历三个数组,我怎么能做到这一点?有没有更好的方法来实现这种层次结构的概念,而无需大量使用数组和循环?

【问题讨论】:

    标签: c# arrays loops


    【解决方案1】:

    除了其他答案之外,我喜欢的另一个选项是在System.Linq 命名空间Contains

    然后你可以写:

    if(easyMaps.Contains(mapId)) {
        //stuff
    }
    

    我个人更喜欢它的可读性。

    【讨论】:

      【解决方案2】:

      您不需要手动遍历每个数组。您可以使用Array.IndexOf<int>(array, value)。此函数将返回给定数组中值的index,如果不在数组中,则返回-1。您可以只使用类似于此的 if 语句:

      if(Array.IndexOf<int>(easyMaps, mapId) != -1){
           //Spawn common_item
      }
      

      【讨论】:

        【解决方案3】:

        您可以在此处使用 Array.Exists 方法,如下所示:

        if(Array.Exists(easyMaps, mapId)) {     // common_items
            // your logic
        }
        
        if(Array.Exists(mediumMaps, mapId)) {   // uncommon_items
            // your logic
        }
        
        if(Array.Exists(hardMaps, mapId)) {     // rare_items
            // your logic
        }
        

        希望这会有所帮助!

        【讨论】:

          【解决方案4】:

          问题
          给定一个 mapId,获取难度级别,然后决定生成什么。

          解决方案:
          使用Dictionary 来保持从 mapId 到 Level 的链接,额外的好处是在字典中查找比搜索数组更快。

          代码如下:

          namespace StackOverflow27884119
          {
              public enum Level
              {
                  Easy,
                  Medium,
                  Hard
              }
          
              class Program
              {
                  private static Dictionary<int, Level> mapsDictionary = new Dictionary<int, Level>()
                          {
                              {7, Level.Easy}, {10, Level.Easy}, {3, Level.Easy}, {44, Level.Easy},
                              {17, Level.Medium}, {14, Level.Medium}, /*...*/ {111, Level.Medium},
                              {92, Level.Hard}, {98, Level.Hard}, {112, Level.Hard}, {145, Level.Hard},
                          };
          
                  static void Main(string[] args)
                  {
                      var mapId = 3;
                      SpawnItem(3);
                  }
          
                  private static void SpawnItem(int mapId)
                  {
                      Level level;
                      bool found = mapsDictionary.TryGetValue(mapId, out level);
                      if (found)
                      {
                          switch (level)
                          {
                              case Level.Easy:
                                  // spawn common_item
                                  break;
                              case Level.Medium:
                                  // spawn common_item
                                  // spawn uncommon_item
                                  break;
                              case Level.Hard:
                                  // spawn common_item
                                  // spawn uncommon_item
                                  // spawn rare_item
                                  break;
                          }
                      }
                  }
              }
          }
          

          PS:我并不完全理解生成物品的确切含义。如果是某种行为,你可以考虑使用策略模式而不是 switch case。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-17
            • 2017-09-10
            • 2015-10-23
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多