IndexOutOfRangeException执行for循环时发生

时间:2015-02-27 05:47:24

标签: c# .net

IEnumerable<char> query = "Not what you might expect";
string vowels = "aeiou";
for (int i = 0; i < vowels.Length; i++)
query = query.Where (c => c != vowels[i]);
foreach (char c in query) Console.Write (c);

发生异常 IndexOutOfRangeException 。为什么发生这种异常看起来很好。

提前致谢。

解决方案

for (int i = 0; i < vowels.Length; i++)
{
char vowel = vowels[i];
query = query.Where (c => c != vowel);
}

这很好,这些代码之间有什么区别。请分享细节。

3 个答案:

答案 0 :(得分:4)

问题是因为

  1. IEnumerables是懒惰的。
  2. 未捕获i的值。
  3. .Where查询仅在您开始打印输出时进行实际评估,此时i == 5导致索引超出范围异常。


    为了更清楚地显示正在发生的事情,下面是循环每次迭代的等效查询(请注意query始终引用原始查询):

    i = 0;
    query.Where(c => c != vowels[i]);
    
    i = 1;
    query.Where(c => c != vowels[i]).Where(c => c != vowels[i]);
    
    i = 2;
    query.Where(c => c != vowels[i]).Where(c => c != vowels[i]).Where(c => c != vowels[i]);
    
    ...
    

    查看所有查询如何引用i的相同值?在最后一次迭代之后,i再次递增,这导致循环停止。但现在i == 5,这不再是一个有效的索引了!

答案 1 :(得分:1)

当你使用IEnumerable时,只需将.ToList()或.ToArray()添加到你的where子句中,它就会起作用

        IEnumerable<char> query = "Not what you might expect";
        string vowels = "aeiou";
        IEnumerable<char> result = "";
        for (int i = 0; i < vowels.Length; i++)
            query = query.Where(c => c != vowels[i]).ToList(); // or .ToArray()
        foreach (char c in query) Console.Write(c);

希望它有所帮助。

答案 2 :(得分:-1)

在此行中更改变量query的名称

query = query.Where (c => c != vowels[i]);