【发布时间】:2020-08-01 09:23:18
【问题描述】:
我正在使用以下 for 循环来遍历 IEnumerable:
for (int i = 0; i < items.Count(); i++)
{
if (cancellationToken.IsCancellationRequested)
{
return;
}
var obj = items.ElementAt(i);
obj.TranslatedText = await Task.Run(() => Translator.Translate(obj.EnglishText, "English", File.Lang));
progress.Report(i + 1);
await Task.Delay(DELAY);
}
上面的代码跳过了备用元素。即使计数为 7,循环也只运行了 4 次。
我尝试将for 循环替换为等效的foreach 循环:
int current = 0;
foreach (var item in items)
{
if (cancellationToken.IsCancellationRequested)
{
return;
}
item.TranslatedText = await Task.Run(() => Translator.Translate(item.EnglishText, "English", File.Lang));
progress.Report(++current);
await Task.Delay(DELAY);
}
它工作正常,我不知道这两者之间有什么不同。
我又挖了一点,发现如果我删除线
obj.TranslatedText = await Task.Run(() => Translator.Translate(obj.EnglishText, "English", File.Lang));
从第一个示例中,它执行得很好。
我不能修改 IEnumerable 的内容吗?只是好奇。
更新 1 我在下面发布了一个可重现的示例。
【问题讨论】:
-
这里的
items是什么?你能提供一个minimal reproducible example吗? (例如,如果items是查询的结果,您可能只需要先实现结果......由于您使用ElementAt的方式,这也可以避免多次迭代它。) -
这种解释不如minimal reproducible example 真正有用...如果更改
item.TranslatedText会影响ObservableCollection,那肯定会解释奇怪。 -
@JonathanAlfaro:OP 没有在 lambda 表达式中捕获
i,所以这不会有任何区别。老实说,虽然我们看不到minimal reproducible example,但可能不值得推测发生了什么。 -
正如我所想 -
items不是ObservableCollection,它是查询的结果。将添加一个答案。 -
请注意,这里的异步性无关紧要 - 您可以简化代码以将其删除,以及 BindableBase。这是一个更简单的复制:gist.github.com/jskeet/f23466beebf977b56fd7a1907771f950
标签: c# ienumerable