如何在foreach循环中删除数组的当前元素?
解决foreach中删除当前数组元素的问题
直接在foreach循环里删除集合元素会触发InvalidOperationException,因为foreach依赖集合的只读迭代器,遍历过程中修改原集合会破坏迭代状态。下面给你几种可行的实现方案:
方案1:倒序for循环(适合List或数组)
如果是List<T>,可以直接通过索引删除;如果是数组,需要重新生成新数组。倒序遍历的好处是删除元素不会影响未遍历到的元素索引:
// 假设array是List<YourItemType>类型 for (int i = array.Count - 1; i >= 0; i--) { bool isSuccess = method.DoSomething(); // 这里包含提交JSON到新库的逻辑,成功返回true if (isSuccess) { array.RemoveAt(i); } } // 如果是数组类型 for (int i = array.Length - 1; i >= 0; i--) { bool isSuccess = method.DoSomething(); if (isSuccess) { array = array.Where((_, idx) => idx != i).ToArray(); } }
方案2:先收集待删除元素,再批量移除
先遍历收集所有需要删除的元素,再统一从原集合中移除,避免遍历过程中修改集合:
var itemsToDelete = new List<YourItemType>(); foreach (var item in array) { bool isSuccess = method.DoSomething(); if (isSuccess) { itemsToDelete.Add(item); } } foreach (var item in itemsToDelete) { array.Remove(item); // 仅适用于List<T>,数组可转List处理后再转回数组 }
方案3:用LINQ生成新集合(无修改原集合风险)
通过LINQ筛选出不需要删除的元素,生成新的集合替代原集合,这种方式更简洁:
// 假设array是数组类型,转成数组输出;如果是List就用ToList() array = array.Where(item => { bool isSuccess = method.DoSomething(); return !isSuccess; // 成功的元素被排除(即删除),失败的保留 }).ToArray();
注意:确保method.DoSomething()里的HTTP请求逻辑是幂等的,避免重复提交导致数据重复;同时要处理请求异常,比如网络错误时不要误删元素。
内容的提问来源于stack exchange,提问作者Steven Tumler
相关产品推荐
相关产品推荐

