使用带有List的LINQ时出现InvalidOperationException

时间:2017-05-19 06:10:58

标签: asp.net .net list linq asp.net-core

我想更改我的代码以使用LINQ。

我之前的代码在这里工作:

// Remove unselected features
var removedFeatures = new List<VehicleFeature>();
foreach(var f in v.Features)
  if(!vr.Features.Contains(f.FeatureId))
     removedFeatures.Add(f);

当我像这样将它重构为LINQ时:

 var removedFeatures=v.Features.Where(f=>!vr.Features.Contains(f.FeatureId));
 foreach(var f in removedFeatures)
    v.Features.Remove(f);

我得到以下例外:

  

InvalidOperationException:修改了集合;枚举操作可能无法执行。   System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)

我知道这意味着我的代码在迭代列表时修改了一个列表,但我不知道这个错误发生在哪里?

4 个答案:

答案 0 :(得分:2)

var removedFeatures=v.Features.Where(f=>!vr.Features.Contains(f.FeatureId));
foreach(var f in removedFeatures)
   v.Features.Remove(f);

removedFeatures只是一个迭代器,而不是列表。当foreach运行时,它基本上会说'#34;让我下一个项目符合标准&#34;。这是第一次执行Where()。因此,如果删除第一个,则v.Features列表会更改。

var removedFeatures=v.Features
                     .Where(f=>!vr.Features.Contains(f.FeatureId))
                     .ToList();

通过添加ToList(),您可以创建一个单独的项目列表,以便您删除该项目。

答案 1 :(得分:1)

您必须使集合可枚举而不是可查询使用ToList()

foreach(var f in removedFeatures.ToList())
    v.Features.Remove(f);

答案 2 :(得分:0)

而不是foreach循环尝试for循环。

for (var i = 0; i < removedFeatures.Count; i++)
{
       v.Features.Remove(removedFeatures[i--]);
}

答案 3 :(得分:-1)

甚至更简单

var features = new int[] {1, 2, 3, 4, 5};
var removedFeatures = new int[] { 1, 2, 3 };
features = features.Except(removedFeatures).ToArray();
//4, 5