对于每个用键值对(即可枚举)的索引耗尽?



我遇到了一个奇怪的问题,我无法想象为什么。每当我使用 foreach 运行自定义填充的 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执行本身的错误(。

错误出在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 查询在每次迭代中都会延迟运行,而不是在您定义查询时运行。