在列表中调用删除<T> .ForEach只删除交替项目?

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)

但是一个广告系列被删除,下一个广告系列被删除,下一个广告系列被删除,下一个广告系列不被删除.代码有什么问题?

Mic*_*Liu 9

你在迭代它时修改列表,这是不好的.改用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方法不在内部使用枚举器,因此不会抛出任何异常来警告您可能存在的错误.这种不一致foreachForEach对我来说似乎是一个设计缺陷.

更新:正如AlanT所说,另一种技术是调用之前过滤掉你不想要的项目ToList.这是怎么做的:

var listCurrentBuzzCompaigns = _buzzService.GetAllActiveCompaigns()
    .Where(x.MayaMembership.MayaProfile.MayaProfileId != profile_id)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

请注意,我已通过更改==为已将条件反转!=.