我想更改我的代码以使用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)
我知道这意味着我的代码在迭代列表时修改了一个列表,但我不知道这个错误发生在哪里?
答案 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