【问题标题】:Index out of bounds exception in c#c#中的索引越界异常
【发布时间】:2012-10-25 22:31:11
【问题描述】:

我的程序中有以下代码在抛出索引超出范围异常 line yearList.SetValue(years[count], count);

protected void invoiceYear_DataBound(object sender, EventArgs e)
        {
           //invoiceYear.SelectedItem.Value= GetYearRange();
            String[] years = GetYearRange().Split(new char[] { '[', ',', ']',' ' });
            ListItem [] yearList = new ListItem[]{};
            System.Diagnostics.Debug.WriteLine("years-->" + years.Length);
            for (int i = 0; i < years.Length; i++)
            {
                System.Diagnostics.Debug.WriteLine("years-->" + years.GetValue(i));

            }
            int count = 0;
            foreach (String str in years)
            {
                if (string.IsNullOrEmpty(str))
                    System.Diagnostics.Debug.WriteLine("empty");
                else
                {
                    yearList.SetValue(years[count], count);
                    count++;
                }
            }

            //System.Diagnostics.Debug.WriteLine("yearList-->" + yearList.GetValue(0));
            //invoiceYear.Items.AddRange(yearList);
        }

【问题讨论】:

  • 您实际上还没有问过问题。您可能想更新您的帖子以包含一个问题。
  • 您是否尝试过调试,看看当您使用 count 访问 years 数组时它的值是多少?
  • 它在第一个循环本身中抛出此异常..意味着 count=0;我猜,它的声明“ListItem [] yearList = new ListItem[]{};”的问题我猜它初始化为 0 索引。但我没有得到如何声明一个动态数组?或者也可能是其他东西..但我无法弄清楚..

标签: c# indexoutofboundsexception


【解决方案1】:

你还没有问过问题,所以我猜你的问题只是“为什么?”

yearList 被定义为一个空数组:

ListItem [] yearList = new ListItem[]{};

它的长度始终为零。因此,您不能设置它的任何元素,因为它没有要设置的元素。

更新

您现在问:“但我不知道如何声明动态数组??”

.NET 中没有动态数组。根据您的方案,您有许多不同的集合类型。我建议List&lt;ListItem&gt; 可能是您想要的。

List<ListItem> yearList = new List<ListItem>(); // An empty list

然后

yearList.Add(years[count]); // Adds an element to the end of the list.

或者,整个循环可以更好地写成:

        foreach (String str in years)
        {
            if (string.IsNullOrEmpty(str))
                System.Diagnostics.Debug.WriteLine("empty");
            else
            {
                yearList.Add(str);
            }
        }

那么您不必担心count,也不会失步(因为您只会在 str 包含某些内容时增加计数 - 这可能不是您想要的)

更新 2 如果您最后确实需要一个数组,您可以随时使用yearList.ToArray() 将列表转换为数组,但请记住在文件顶部添加using System.Linq;,因为它是LINQ 提供的扩展方法,而不是List 类本身的一部分。

【讨论】:

  • 我的问题是我的索引越界异常。我不知道为什么所以你是对的..是的..我如何在这里声明一个动态数组?请建议
  • 感谢 Colin,它解决了我的问题...但是更正一下,我们无法将字符串添加到列表项列表中。无论如何我都想通了
【解决方案2】:

如果你想保留计数器,为什么要使用 Foreach 循环?

        foreach (var int i = 0; i < years.Length; i++)
        {
            if (string.IsNullOrEmpty(years[i]))
                System.Diagnostics.Debug.WriteLine("empty");
            else
            {
                yearList.SetValue(years[i], i);
            }
        }

【讨论】:

  • 我也用过这个..但同样的问题..所以我转向了 foreach..但这有点帮助..so..
  • 好吧@ColinMackay 向您解释了问题并给了您答案,但我只是说您不使用提供的工具不好。
  • 我现在了解到您之前尝试过 for 循环,而不是因为有 IndexOutOfBoundsException 而切换到 foreach。
【解决方案3】:

我不知道你的目标是什么,也没有ListItem的经验,但是你有没有考虑过这种方法:

string[] yearList = years.Where(y => !string.IsNullOrEmpty(y)).ToArray();

这会创建一个包含所有非空或非空年份的数组。它还取决于您如何使用该列表来确定这是否有用。如果它不需要是一个数组,那么你甚至可以这样做:

var yearList = years.Where(y => !string.IsNullOrEmpty(y));

请注意,这些解决方案在诊断输出或ListItem 的使用方面与您的代码所做的并不完全相同。这还取决于您使用的 .net 版本是否适合您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 2013-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多