IEnumerable IndexOutOfRangeException(IEumable IndexOutOfRangeException异常)
问题描述
我不知道为什么使用此代码会得到System.IndexOutOfRangeException: 'Index was outside the bounds of the array.'
IEnumerable<char> query = "Text result";
string illegals = "abcet";
for (int i = 0; i < illegals.Length; i++)
{
query = query.Where(c => c != illegals[i]);
}
foreach (var item in query)
{
Console.Write(item);
}
请解释一下我的代码出了什么问题。
推荐答案
问题是,您的lambda表达式捕获变量i,但直到循环之后才执行委托。执行表达式c != illegals[i]时,i为illegals.Length,因为这是i的最终值。重要的是要理解lambda表达式捕获变量,而不是"lambda表达式转换为委托时那些变量的值"。
以下是修复代码的五种方法:
选项1:I的本地副本
将i的值复制到循环内的局部变量中,这样循环的每次迭代都会捕获lambda表达式中的一个新变量。循环的其余执行过程不会更改该新变量。
for (int i = 0; i < illegals.Length; i++)
{
int copy = i;
query = query.Where(c => c != illegals[copy]);
}
选项2:在lambda表达式之外提取非法移民[i]
在循环中提取illegals[i]的值(在lambda表达式之外),并在lambda表达式中使用该值。同样,更改i的值不会影响变量。
for (int i = 0; i < illegals.Length; i++)
{
char illegal = illegals[i];
query = query.Where(c => c != illegal);
}
选项3:使用Foreach循环
此选项仅适用于C#5和更高版本的编译器,因为foreach在C#5中的含义已更改(变得更好)。
foreach (char illegal in illegals)
{
query = query.Where(c => c != illegal);
}
选项4:使用一次Except
Except。这与前面的选项和不太一样,因为您只会得到输出中任何特定字符的单个副本。因此,如果e不在illegals中,您将使用上述选项得到"tex resul",但使用Except得到"tex rsul"。不过,还是值得了解的:
// Replace the loop entirely with this
query = query.Except(illegals);
选项5:使用一次Contains
您可以调用Where一次,调用Contains的lambda表达式:
// Replace the loop entirely with this
query = query.Where(c => !illegals.Contains(c));
这篇关于IEumable IndexOutOfRangeException异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:IEumable IndexOutOfRangeException异常
基础教程推荐
- .NET SerialPort DataReceived 事件未触发 2022-01-01
- Azure Functions:CosmosDBTrigger 未在 Visual Studio 中触发 2022-01-01
- Moq It.Is<>不匹配 2022-01-01
- C# 从 List<List<int>> 中删除重 2022-01-01
- WPF 模态进度窗口 2022-01-01
- 禁止输入少量字符,例如'<'、'&a 2022-01-01
- 如何使用 .Net 检查 Active Directory 服务器是否已启动并正在运行? 2022-01-01
- 当值可以是对象或空数组时反序列化 JSON 2022-01-01
- 如果有人提交恶意软件Nuget包怎么办? 2022-01-01
- 我应该在后面的代码中直接使用 Linq To SQL 还是使 2022-01-01
