我试图创建一个程序来读取一个包含50个随机单词的文件,它将名为SmallWords的单词中包含3个字母或更少的单词,以及名为LargeWords的单词中包含4个或更多单词的单词。我使用的是Windows窗体,我有一个带有2列的ListView控件...' Small Words'和“大词”#39;很明显,我想要做的只是将单词放在相应的列中。问题是文件没有25个小字和25个大字,你知道吗?也许它有30个小单词和20个大单词,所以当我执行此循环以向ListView添加项时,它会抛出此异常:
ArgumentOutOfRangeException。
这是我的代码
var MaxNum = Math.Max(SmallWords.Count, LargeWords.Count);
for (var index = 0; index < MaxNum; index++)
{
ListViewItem item = new ListViewItem(SmallWords[index]);
item.SubItems.Add(LargeWords[index]);
listView1.Items.Add(item);
}
此行item.SubItems.Add(LargeWords[index]);
有办法解决这个问题吗?或者像将另一种方法添加到列中一样?我知道它有效,因为如果将Math.Max(...);
更改为Math.Min(...)
它会添加单词,但只添加20个大单词和20个小单词,我将会在SmallWords列中丢失10个小单词。
由于
答案 0 :(得分:1)
您有两个不同长度的数组,并尝试循环访问并访问两个数组的最大值。这永远不会奏效。一旦达到较小数组的极限,就会超出范围异常。
要修复的两个选项取决于您要执行的操作。您可以循环到较小数组的最大值,或者一旦达到最大值,就可以跳过处理较小数组的部分。
var MaxNum = Math.Min(SmallWords.Count, LargeWords.Count);
// ^--- Changed Max to Min
for (var index = 0; index < MaxNum; index++)
{
ListViewItem item = new ListViewItem(SmallWords[index]);
item.SubItems.Add(LargeWords[index]);
listView1.Items.Add(item);
}
答案 1 :(得分:0)
我认为你应该以不同的方式看待这个问题。基本上,您在i
索引处将一个大词添加到同一索引处的小词。这意味着您必须使用SmallWord将LargeWord添加为子项。忘记找到最小值或最大值,只需遍历SmallWords计数,只有在索引在范围内时才添加LargeWords:
for (var index = 0; index < SmallWords.Length; index++)
{
ListViewItem item = new ListViewItem(SmallWords[index]);
if(index < LargeWords.Length)
{
item.SubItems.Add(LargeWords[index]);
}
listView1.Items.Add(item);
}