Foreach用一个键值对可计算的索引用完了吗?

时间:2018-09-17 09:32:33

标签: c#

我遇到了一个奇怪的问题,为什么我无法想象。每当我使用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执行本身中的错误)。

1 个答案:

答案 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查询是延迟运行的,而不是在您定义查询时立即运行。