Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 退出后返回While循环(涉及IEnumerable)导致边界错误_C#_Loops_Search_Ienumerable - Fatal编程技术网

C# 退出后返回While循环(涉及IEnumerable)导致边界错误

C# 退出后返回While循环(涉及IEnumerable)导致边界错误,c#,loops,search,ienumerable,C#,Loops,Search,Ienumerable,我知道有很多方法可以剥除这只猫的皮肤,但是基本的while循环存在一些问题,该循环正确退出,但在从父函数返回IEnumerable.ToList()时返回(并增加计数器)。基本上,我试图做的是搜索单个关键字的列表并过滤结果集,直到我只得到包含所有关键字的项目 它退出循环,然后一旦返回被命中,它就返回到循环中,i变量增加到另一个位置(高于count变量),因此breake[i]抛出一个越界错误 虽然我知道有更好的方法来执行搜索,但我也非常感兴趣的是,为什么代码会返回到一个退出的循环中,再次递增,并

我知道有很多方法可以剥除这只猫的皮肤,但是基本的while循环存在一些问题,该循环正确退出,但在从父函数返回IEnumerable.ToList()时返回(并增加计数器)。基本上,我试图做的是搜索单个关键字的列表并过滤结果集,直到我只得到包含所有关键字的项目

它退出循环,然后一旦返回被命中,它就返回到循环中,i变量增加到另一个位置(高于count变量),因此breake[i]抛出一个越界错误

虽然我知道有更好的方法来执行搜索,但我也非常感兴趣的是,为什么代码会返回到一个退出的循环中,再次递增,并导致错误——以及如何修复它。这很奇怪,我以前从未见过。是因为.ToList正在强制枚举备份链吗

代码:

public IEnumerable GetItemsForSearch(字符串搜索=null)
{
ParserDataContext数据=新的ParserDataContext();
if(search!=null&&search!=“”)
{                   
string[]breaked=search.Split(“”);
IEnumerable watches=data.Items.Where(x=>x.Title.ToLower().Contains(breaked[0].ToLower()).OrderByDescending(x=>x.DateList)。然后ByDescending(x=>x.ID);
int i=1;
int count=breaked.count();
而(我<计数)
{
if(断开[i]!=null)
item=items.Where(x=>x.Title.ToLower().Contains(breaked[i].ToLower());
i++;
}
返回项目.Take(50).ToList();
}
}

虽然我知道有更好的方法来执行搜索,但我也非常感兴趣的是为什么代码会返回到一个退出的循环中,再次递增,并导致错误

首先要了解实际发生的情况:代码不会返回到已退出的循环中,它只会在错误的时间点(即,在变量增加后)使用变量
i
的值。这是一个已知的特性:编译器直接捕获
i
i
,而不进行复制

显然,这项功能已经够烦人的了,微软宣布修复了C#5.0中的一个常见错误案例(特别是在
foreach
loop中关闭循环变量)

以及如何修复它

对于C#4.5的用户,一个简单的修复方法是声明一个临时变量,而不是使用
i
。编译器将捕获临时文件的值,使行为符合您的预期:

while (i < count) {
    if (broken[i] != null) {
        var tmp = broken[i].ToLower();
           items = items.Where(x => x.Title.ToLower().Contains(tmp));
        }
        i++;
    }
}
虽然我知道有更好的方法来执行搜索,但我也非常感兴趣的是为什么代码会返回到一个退出的循环中,再次递增,并导致错误

首先要了解实际发生的情况:代码不会返回到已退出的循环中,它只会在错误的时间点(即,在变量增加后)使用变量
i
的值。这是一个已知的特性:编译器直接捕获
i
i
,而不进行复制

显然,这项功能已经够烦人的了,微软宣布修复了C#5.0中的一个常见错误案例(特别是在
foreach
loop中关闭循环变量)

以及如何修复它

对于C#4.5的用户,一个简单的修复方法是声明一个临时变量,而不是使用
i
。编译器将捕获临时文件的值,使行为符合您的预期:

while (i < count) {
    if (broken[i] != null) {
        var tmp = broken[i].ToLower();
           items = items.Where(x => x.Title.ToLower().Contains(tmp));
        }
        i++;
    }
}

您正在使用线程执行任何操作吗?您没有提供完整的代码,不清楚在哪里调用此方法,以及在
返回后它将转到哪里。考虑一下提供。为什么在这里使用一个while循环,当你基于你提供的代码时,for for循环更适合可读性?你对线程做了什么?你没有提供一个完整的代码,它不清楚这个方法在哪里被调用,它在“代码>返回< /代码>之后去哪里。考虑提供。为什么在使用基于你提供的代码的while循环时,for循环更适合可读性?修复仅适用于<代码>前缀构造。(从下面的链接:UPDATE:我们正在进行突破性的更改。在C#5中,foreach的循环变量将在逻辑上位于循环内部,因此每次闭包都将关闭该变量的新副本。“for”循环不会更改。).哇,这真是太棒了。我不能提高投票率,因为我没有足够的声誉。有人能帮我吗?谢谢!修复只针对
foreach
结构(从下面的链接:UPDATE:我们正在进行突破性的更改。在C#5中,foreach的循环变量将在逻辑上位于循环内部,因此每次闭包都将关闭该变量的新副本。“for”循环不会更改。)哇,这真是个冠军。我没法提高投票率,因为我没有足够的声誉。有人能帮我吗?谢谢!
var allBroken = broken.Where(b => b != null).Select(ToLower).ToList();
var items = items
    .Select(item => new {Item = item, Title = item.Title.ToLower()})
    .Where(pair => allBroken.Any(broken => pair.Title.Contains(broken)))
    .ToList();