【问题标题】:Converting String array to int (months into numbers)将字符串数组转换为 int(将月份转换为数字)
【发布时间】:2017-05-08 03:56:51
【问题描述】:

目前我有一个 600 个月(1 月到 12 月)的数组,我想根据初始数组创建一个新的 int 数组。

目前我有(忽略任何旧版。因为我从不同的类中调用数组)

       for (int i = 0; i < Legacy.Month1.Length; i++)
        {

            int[] MonthNo1 = new int[Legacy.Month1.Length];

            switch (Legacy.Month1[i])
            {
                case "January ":
                    MonthNo1[i] = 1;
                    break;
                case "February ":
                    MonthNo1[i] = 2;
                    break;
                case "March ":
                    MonthNo1[i] = 3;
                    break;
                case "April ":
                    MonthNo1[i] = 4;
                    break;
                case "May":
                    MonthNo1[i] = 5;
                    break;
                case "June ":
                    MonthNo1[i] = 6;
                    break;
                case "July ":
                    MonthNo1[i] = 7;
                    break;
                case "August ":
                    MonthNo1[i] = 8;
                    break;
                case "September ":
                    MonthNo1[i] = 9;
                    break;
                case "October":
                    MonthNo1[i] = 10;
                    break;
                case "November":
                    MonthNo1[i] = 11;
                    break;
                case "December ":
                    MonthNo1[i] = 12;
                    break;
            }

            for (int j = 0; i < MonthNo1.Length; j++)
            {

                Console.WriteLine(MonthNo1[j]);

            }

不幸的是,这似乎不起作用。

它成功输出了第一个转换后的数字,但其他599个都是空白。最重要的是,在流程结束时,我得到了异常

System.IndexOutOfRangeException

与代码底部的Console.WriteLine(MonthNo1[j]);有关。

谁能看出我哪里出了问题?

【问题讨论】:

  • 好吧,按照我的逻辑,int[] MonthNo1 = new int[Legacy.Month1.Length] 将为每个循环创建一个包含 600 个整数的新数组,MonthNo1 在第一个循环结束时将只包含一条记录(因此抛出索引超出范围), 我对吗?尝试将int[] MonthNo1 = new int[Legacy.Month1.Length] 拉到第一个循环之外。

标签: c# arrays for-loop initialization


【解决方案1】:

第一个问题的答案是将循环中的MonthNo1数组初始化移出。将行 int[] MonthNo1 = new int[Legacy.Month1.Length]; 移到外部 for 循环之外。我还建议将第二个 for 循环移到第一个 for 循环之外,因为您只需要迭代一次 MonthNo1,而不是每次向其中添加元素时。

第二个问题是由于第二个for 循环中的条件不正确引起的。请注意,在第二个for 循环中,计数器变量是j,而不是i

【讨论】:

    【解决方案2】:

    不要使用开关,让我们创建一个新列表。比较后,只需添加到新列表中。请尝试以下操作:

    var monthNo1 = new List<int>();
    if(!string.IsNullOrEmpty(Legacy.Month1[i]))
    {
    if (Legacy.Month1[i].Trim() == "January")
    monthNo1 .Add(1);
    if (Legacy.Month1[i].Trim() == "February")
    monthNo1 .Add(2);
    ...
    }
    
    for (int j = 0; i < monthNo1.Length - 1; j++)
    {
        Console.WriteLine(monthNo1[j]);    
    }
    

    【讨论】:

      【解决方案3】:

      必须在for (int i = 0; i &lt; Legacy.Month1.Length; i++)之前初始化数组

      for 循环中删除 int[] MonthNo1 = new int[Legacy.Month1.Length];

      for 循环 之前添加它,因为您在每个循环上初始化数组,以便它每次都覆盖。

      结果:

      int[] MonthNo1 = new int[Legacy.Month1.Length];
      
      for (int i = 0; i < Legacy.Month1.Length; i++)
      {
            switch (Legacy.Month1[i])
            {
                case "January ":
                    MonthNo1[i] = 1;
                    break;
                case "February ":
                    MonthNo1[i] = 2;
                    break;
            }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-21
        • 2016-08-14
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        • 1970-01-01
        • 2023-03-13
        • 2020-05-12
        相关资源
        最近更新 更多