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)
请注意,我已通过更改==为已将条件反转!=.