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);
}
这很好,这些代码之间有什么区别。请分享细节。
答案 0 :(得分:4)
问题是因为
i
的值。 .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]);