我遇到了一个奇怪的问题,为什么我无法想象。每当我使用foreach遍历KeyValuePair条目的自定义填充IENumerable时,都会出现错误:Index was out of range. Must be non-negative and less than the size of the collection. Prameter name: index
问题是:为什么会这样?
代码:
private void extractData(List<string> data)
{
IEnumerable<KeyValuePair<string, string>> extData;
extData =
data.Where((s, i) => i % 2 == 0)
.Select((s, i) =>
new KeyValuePair<string, string>(s, data.ElementAt(i * 2 + 1)));
string extJournal = String.Empty;
List<KeyValuePair> myData = new List<KeyValuePair>();
foreach (KeyValuePair<string, string> keyValuePair in extData)
{
//1
myData.Add(keyValuePair);
//2
extJournal+= string.Format("Metadata({0}): {1}{2}",
keyValuePair.Key, keyValuePair.Value, System.Environment.NewLine);
//3
}
}
作为此处的附加信息:该错误似乎不在数据集上发生,而是在foreach部分发生(如果我输入调试消息而不是// 1-3,则得到所有3个输出,但仍然会遇到错误直接指向foreach执行本身中的错误)。
答案 0 :(得分:3)
错误出在您的Where
选择器中
IEnumerable<KeyValuePair<string, string>> extData;
extData =
data.Where((s, i) => i % 2 == 0)
.Select((s, i) =>
new KeyValuePair<string, string>(s, data.ElementAt(i * 2 + 1)));
如果列表包含3个元素,则第3个元素i(2) % 2
将为0。在Select
元素(i(1)* 2 +1)== 3中,选择第4个元素,但超出列表范围。
将Where
选择器更改为包含&& i <= data.Count - 2
请注意,对于每次迭代,Linq查询是延迟运行的,而不是在您定义查询时立即运行。