uce*_*cef 0 .net c# foreach lambda list
我有一个对象列表,我想删除满足条件的所有对象.这是我的代码:
var listCurrentBuzzCompaigns = _buzzService.GetAllActiveCompaigns().ToList();
listCurrentBuzzCompaigns.ForEach(x => {
if (x.MayaMembership.MayaProfile.MayaProfileId == profile_id)
listCurrentBuzzCompaigns.Remove(x);
});
Run Code Online (Sandbox Code Playgroud)
但是一个广告系列被删除,下一个广告系列被删除,下一个广告系列被删除,下一个广告系列不被删除.代码有什么问题?
你在迭代它时修改列表,这是不好的.改用List<T>.RemoveAll
方法:
listCurrentBuzzCompaigns.RemoveAll(x => x.MayaMembership.MayaProfile.MayaProfileId == profile_id);
Run Code Online (Sandbox Code Playgroud)
通常,当您使用foreach
关键字迭代a时List<T>
,InvalidOperationException
如果检测到列表已被修改,则枚举器将抛出一个.此行为旨在防止您遇到的错误.不幸的是,该List<T>.ForEach
方法不在内部使用枚举器,因此不会抛出任何异常来警告您可能存在的错误.这种不一致foreach
和ForEach
对我来说似乎是一个设计缺陷.
更新:正如AlanT所说,另一种技术是在调用之前过滤掉你不想要的项目ToList
.这是怎么做的:
var listCurrentBuzzCompaigns = _buzzService.GetAllActiveCompaigns()
.Where(x.MayaMembership.MayaProfile.MayaProfileId != profile_id)
.ToList();
Run Code Online (Sandbox Code Playgroud)
请注意,我已通过更改==
为已将条件反转!=
.