C#修改使用forEach迭代的列表

问题描述

我想了解是否有可能使用forEach修改正在迭代的列表,从而无需维护索引。

var scanResults = await someFunction();
for (int i = 0; i < scanResults.Data.Count(); i++)
{
    if ((scanResults.Data.ToList()[i].Filters.Count() == 0) != (scanResults.Data.ToList()[i].SubscribedFilters.Count() == 0))
    {
        scanResults.Data.ToList()[i] = await AddFilters(scanResults.Data.ToList()[i]);
    }
}
return scanResults;

解决方法

请注意,John和我本人在评论中提到,在您的代码中,您正在嵌套检查和语句中使用ToList()(可能是System.Linq)(这可能是一个逻辑错误);这意味着您每次都在创建一个新列表。假设您在整个嵌套语句中引用了一个列表,则您会遇到InvalidOperationException并显示消息集合已修改

方案1:坚持使用for(;;)循环

这样做的好处是您不需要使用额外的内存来创建临时列表或备用列表。

方案2:foreach,其中包含要修改的临时重复列表

如果您确实坚持使用foreach循环,那么一个简单的选择就是用相同的数据创建一个相同的列表并进行遍历。根据您在列表中正在执行的操作,这可能不起作用。这种方法的缺点是您正在使用额外的内存来存储重复列表。

该问题未提供很多代码,因此我们不能保证在您的情况下这样做更有意义。但是,在大多数情况下,您会尝试坚持使用for(;;)循环。

,

我看不到其余的代码,所以我只能猜测您正在使用的数据类型,但这会是这样的。

foreach (var scanResult in ScanResults)
{
    if ((scanResult.Data.ToList().Filters.Count() == 0) != (scanResult.Data.ToList().SubscribedFilters.Count() == 0))
    {
        scanResult.Data.ToList() = await AddFilters(scanResult.Data.ToList());
    }
}