我想复制一个listBox的项目,从指定的索引开始。如果索引从0开始,它不会给予一个错误(System.IndexOutOfRangeException)。如果它从1开始,它会给出一个错误。
listBox1.Items.AddRange(new string[] { "aaa", "bbb", "ccc", "ddd", "eee" });
object[] array = new object[listBox1.Items.Count];
listBox1.Items.CopyTo(array, 0);
listBox1.Items.CopyTo(array, 1);
我试图理解为什么listBox1.Items.CopyTo()方法不起作用。如果起始索引对0以外的任何索引都不起作用,为什么还有第二个参数。
2条答案
按热度按时间h7wcgrx31#
问题是:
在
ObjectCollection.CopyTo
documentation中可以看到,arrayIndex
参数是:目标数组中要将项从集合复制到的位置。
ListBox
项目列表中的起始索引。CopyTo
将始终复制ListBox
中的所有元素。由于目标
array
分配的元素数等于列表中的项目数,因此必须从索引0复制。例如,如果使用1,则分配ListBox中的最后一个元素将导致越界异常,因为数组只有从1开始的n-1
元素。解决方案(取决于您想要实现的目标):
如果你需要将
ListBox
中的所有元素从索引1开始放入数组中,你需要分配一个额外的元素:或一般而言:
如果你只想从一个给定的索引开始复制一些
ListBox
元素,你可以把这些元素转换成一个数组,然后使用Array.Copy
。下面的代码展示了如何从第二个列表元素(索引1)开始复制列表元素:
z6psavjg2#
从1开始索引时得到
System.IndexOutOfRangeException
的原因是因为您试图从ListBox
(索引1)中的第二个项目开始复制项目,但目标数组不够大,无法容纳所有项目。当你从
0
开始索引时,目标数组足够大,可以容纳所有的项,所以你不会得到错误。要从指定的索引开始复制项目,您需要创建一个具有 * 适当大小 * 的新数组,然后使用
Array.Copy
方法复制项目。下面是一个示例: