一、问题描述
在做 数组、列表、集合遍历时,可能我们会遇见这个问题。Collection was modified;enumeration operation may not execute ,翻译的中文意思:集合已修改;枚举操作可能无法执行。
二、解决方案
就是在遍历时,不要改变正在遍历的集合即可,您可以先遍历完在对其进行操作。
三、案例
出现问题前的代码如下,就是我在遍历 items 的同时,又往 items 中 add 数据。
public async Task<ListResultDto<RecordBookListDto>> GetFlatRecordBookItems(){var query = _recordBookRepository.GetAll();var entities = await query.ToListAsync();var items = new List<RecordBookListDto>();foreach (var entity in entities){var dto = entity.MapTo<RecordBookListDto>();items.Add(dto);}//todo 获取测点编号foreach (var item in items){if (!string.IsNullOrEmpty(item.DataId)){String[] array = item.DataId.Replace("[", "").Replace("]", "").Replace("\"", "").Split(',');foreach (var ar in array){var ins = _instrumentGroupRepository.Get(Guid.Parse(ar));var l = new RecordBookListDto();l.Id = Guid.Parse(ar);l.ParentId = item.Id.ToString();l.Name = ins.No;items.Add(l);}}}var listDto = new ListResultDto<RecordBookListDto>(items);return listDto;}
修改完成后的代码:
public async Task<ListResultDto<RecordBookListDto>> GetFlatRecordBookItems(){var query = _recordBookRepository.GetAll();var entities = await query.ToListAsync();var items = new List<RecordBookListDto>();foreach (var entity in entities){var dto = entity.MapTo<RecordBookListDto>();items.Add(dto);}List<RecordBookListDto> newItems = new List<RecordBookListDto>();//todo 获取测点编号foreach (var item in items){if (!string.IsNullOrEmpty(item.DataId)){String[] array = item.DataId.Replace("[", "").Replace("]", "").Replace("\"", "").Split(',');foreach (var ar in array){var ins = _instrumentGroupRepository.Get(Guid.Parse(ar));var l = new RecordBookListDto();l.Id = Guid.Parse(ar);l.ParentId = item.Id.ToString();l.Name = ins.No;newItems.Add(l);}}}foreach (var item in newItems){items.Add(item);}var listDto = new ListResultDto<RecordBookListDto>(items);return listDto;