gpt4 book ai didi

c# - IEnumerable IndexOutOfRangeException异常

转载 作者:太空狗 更新时间:2023-10-30 00:13:40 26 4
gpt4 key购买 nike

我不知道为什么我会收到 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,但委托(delegate)直到循环结束后才执行。当表达式 c != illegals[i] 被执行时,iillegals.Length,因为那是 的最终值>我。重要的是要了解 lambda 表达式捕获变量,而不是“那些变量在 lambda 表达式被转换为委托(delegate)时的值”。

这里有五种修复代码的方法:

选项 1:i 的本地副本

i 的值复制到循环内的局部变量中,以便循环的每次迭代都在 lambda 表达式中捕获一个新变量。循环的其余执行不会更改该新变量。

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

选项 2:在 lambda 表达式之外提取 illegals[i]

在循环中(在 lambda 表达式之外)提取 illegals[i] 的值,并在 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 一次

LINQ 提供了一种执行集合排除的方法:Except。这与之前的选项完全相同,因为您只会在输出中得到任何特定字符的单个副本。因此,如果 e 不在 illegals 中,您将使用上述选项得到“Tex resul”的结果,但使用 Except< 得到的结果是“Tex rsul”/。不过,值得了解的是:

// Replace the loop entirely with this
query = query.Except(illegals);

选项 5:使用一次包含

您可以使用调用 Contains 的 lambda 表达式调用一次 Where:

// Replace the loop entirely with this
query = query.Where(c => !illegals.Contains(c));

关于c# - IEnumerable IndexOutOfRangeException异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52575358/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com