C# 对于每一个使用keyvaluepair ienumerable的索引耗尽?

C# 对于每一个使用keyvaluepair ienumerable的索引耗尽?,c#,C#,我遇到了一个奇怪的问题,我无法想象为什么。每当我使用foreach运行自定义填充的IENumerable的KeyValuePair条目时,我都会得到一个错误:索引超出范围。必须为非负数且小于集合的大小。参数名称:索引 问题是:为什么会发生这种情况 代码: 作为此处的附加信息:错误似乎不是在数据集签名期间发生的,而是在foreach部分发生的,如果我将调试消息而不是//1-3,我将获得所有3个输出,但仍然遇到一个错误,该错误直接指向foreach执行本身中的错误。错误在您的Where选择器中 如果

我遇到了一个奇怪的问题,我无法想象为什么。每当我使用foreach运行自定义填充的IENumerable的KeyValuePair条目时,我都会得到一个错误:索引超出范围。必须为非负数且小于集合的大小。参数名称:索引

问题是:为什么会发生这种情况

代码:

作为此处的附加信息:错误似乎不是在数据集签名期间发生的,而是在foreach部分发生的,如果我将调试消息而不是//1-3,我将获得所有3个输出,但仍然遇到一个错误,该错误直接指向foreach执行本身中的错误。

错误在您的Where选择器中

如果列表有3个元素,则对于第3个元素,i2%2将为0。在Select元素i1*2+1==3中,选择了第四个元素,但这超出了列表的范围


将Where选择器更改为include&&i这是foreach中的所有代码吗?是否正确复制了这些代码?拆分数据从何而来?这些是列表myData中的语法错误line@sertsedat是的,我不明白为什么,因为我尝试了我能想到的一切。我甚至花了整整一个小时来确保它确实发生在foreach循环内部/与foreach循环一起,并且非常震惊。LINQ查询在foreach中执行,但错误在查询中。使用ElementAtOrDefault而不是返回null的ElementAt,然后检查您的逻辑。data.ElementAti*2+1将不起作用。由于IEneumerable是惰性的,因此您会看到错误稍后在foreach中弹出。因此,错误出现在foreach中的原因是,当设置extdata时,整个过程并没有完成,但后来在foreach中,tnx工作得很好。另一种方法是将ElementAtOrderFault替换为elementat,然后检查空键。
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
  }

}
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)));