winforms ListBox.Items.CopyTo()方法

hgc7kmma  于 2023-03-31  发布在  其他
关注(0)|答案(2)|浏览(225)

我想复制一个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以外的任何索引都不起作用,为什么还有第二个参数。

h7wcgrx3

h7wcgrx31#

问题是:

ObjectCollection.CopyTo documentation中可以看到,arrayIndex参数是:
目标数组中要将项从集合复制到的位置。

    • 不是**ListBox项目列表中的起始索引。

CopyTo始终复制ListBox中的所有元素。
由于目标array分配的元素数等于列表中的项目数,因此必须从索引0复制。例如,如果使用1,则分配ListBox中的最后一个元素将导致越界异常,因为数组只有从1开始的n-1元素。

解决方案(取决于您想要实现的目标):

如果你需要将ListBox中的所有元素从索引1开始放入数组中,你需要分配一个额外的元素:

object[] array = new object[listBox1.Items.Count + 1];
listBox1.Items.CopyTo(array, 1);

或一般而言:

int startIdx = 1;
object[] array = new object[listBox1.Items.Count + startIdx];
listBox1.Items.CopyTo(array, startIdx);

如果你只想从一个给定的索引开始复制一些ListBox元素,你可以把这些元素转换成一个数组,然后使用Array.Copy
下面的代码展示了如何从第二个列表元素(索引1)开始复制列表元素:

object[] array = new object[listBox1.Items.Count - 1];
Array.Copy(listBox1.Items.OfType<string>().ToArray(), 1, array, 0, array.Length);
z6psavjg

z6psavjg2#

从1开始索引时得到System.IndexOutOfRangeException的原因是因为您试图从ListBox(索引1)中的第二个项目开始复制项目,但目标数组不够大,无法容纳所有项目。
当你从0开始索引时,目标数组足够大,可以容纳所有的项,所以你不会得到错误。
要从指定的索引开始复制项目,您需要创建一个具有 * 适当大小 * 的新数组,然后使用Array.Copy方法复制项目。下面是一个示例:

listBox1.Items.AddRange(new string[] { "aaa", "bbb", "ccc", "ddd", "eee" });
int startIndex = 1;
object[] array = new object[listBox1.Items.Count - startIndex];
Array.Copy(listBox1.Items.Cast<object>().ToArray(), startIndex, array, 0, array.Length);

相关问题