0

我的程序中有以下代码,它在 yearList.SetValue(years[count], count); 行抛出 index out of bound 异常;

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);
        }
4

3 回答 3

7

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

yearList被定义为一个空数组:

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

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

更新

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

.NET 中没有动态数组。根据您的方案,您有许多不同的集合类型。我会建议这List<ListItem>可能是你想要的。

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 提供的扩展方法,而不是列表的一部分类本身。

于 2012-10-25T22:36:38.423 回答
0

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

        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);
            }
        }
于 2012-10-25T22:38:07.893 回答
0

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

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

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

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

请注意,这些解决方案在诊断输出或使用ListItem. 它还取决于您使用的 .net 版本是否适合您。

于 2012-10-25T22:57:08.727 回答