foreach (var cProgramme in Programmes) { if (ids.Contains(cProgramme.Id)) { _errorLogService.SaveErrorLogs(cProgramme.Id.ToString(), "Program Id already exists", "Programme"); successFlag = false; continue; } if (_coreRepository.Context.Set<CProgramme>().Any(s => s.Id != cProgramme.Id && s.Name.ToLower() == cProgramme.Name.ToLower() && s.SchoolId == cProgramme.SchoolId)) { _errorLogService.SaveErrorLogs(cProgramme.Id.ToString(), "Program name already exists", "Programme"); successFlag = false; continue; } ids.Add(cProgramme.Id); } 优化这段代码 如何if判断为fase删除集合中这个元素
时间: 2024-02-10 13:17:21 浏览: 107
Parallel.ForEach的卡死现象(线程操作问题C#源码实例)
可以将需要删除的元素在循环外先收集起来,最后再一次性从集合中删除这些元素。这样可以避免在循环中修改集合导致遍历出错的问题。
同时,可以使用`List<T>`的`RemoveAll`方法来删除符合条件的所有元素。
优化后的代码如下:
```csharp
var ids = new HashSet<int>();
var toBeDeleted = new List<CProgramme>();
foreach (var cProgramme in Programmes)
{
if (ids.Contains(cProgramme.Id))
{
_errorLogService.SaveErrorLogs(cProgramme.Id.ToString(), "Program Id already exists", "Programme");
successFlag = false;
toBeDeleted.Add(cProgramme);
continue;
}
if (_coreRepository.Context.Set<CProgramme>().Any(s =>
s.Id != cProgramme.Id &&
s.Name.ToLower() == cProgramme.Name.ToLower() &&
s.SchoolId == cProgramme.SchoolId))
{
_errorLogService.SaveErrorLogs(cProgramme.Id.ToString(), "Program name already exists", "Programme");
successFlag = false;
toBeDeleted.Add(cProgramme);
continue;
}
ids.Add(cProgramme.Id);
}
Programmes.RemoveAll(p => toBeDeleted.Contains(p));
```
在循环中,如果需要删除元素,将其加入到`toBeDeleted`集合中;循环结束后,使用`RemoveAll`方法从`Programmes`集合中删除所有在`toBeDeleted`中的元素。
阅读全文