C#迭代List时满足条件向原列表新增对象的最优实现方案
问题描述
我现有一个包含5个对象的列表,定义如下:
List<ObjA> listA = new List<ObjA>();
当前需求为:遍历该列表的过程中,若当前对象满足指定条件,需要克隆该对象、修改其某一属性后,再添加到listA中。我目前的实现思路是先创建一个临时列表存储待新增的对象,遍历完成后再统一添加到listA中,请问是否有更优的实现方式?
foreach(var a in listA) { //if(a.somecondition is true) // create a clone of 'a' and add it to listA }
解答
你当前用临时列表存储待新增对象的方案本身就是工业界常用的稳妥方案,可读性高、不易出逻辑问题,绝大多数场景下优先推荐使用。
如果要进一步简化实现、省去临时列表的内存开销,也可以用for循环遍历初始长度的方案,核心逻辑是提前存储列表的初始长度,只遍历初始的5个元素,不会遍历到后续新增的对象,实现代码如下:
// 提前存储初始元素数量,仅遍历原始列表的元素 int originalCount = listA.Count; for (int i = 0; i < originalCount; i++) { ObjA current = listA[i]; if (current.满足判断条件) { // 按需实现浅克隆/深克隆逻辑 ObjA clone = (ObjA)current.Clone(); clone.目标属性 = 修改后的值; listA.Add(clone); } }
注意事项
- 不要直接在
foreach循环中添加元素:foreach依赖的集合枚举器会检测集合变更,直接增删元素会抛出InvalidOperationException异常 - 如果你需求是新增的元素满足条件也需要继续克隆新增,可去掉提前存储的
originalCount,直接判断i < listA.Count即可,需要自行控制逻辑避免死循环 - 克隆对象时注意区分浅克隆和深克隆:如果
ObjA包含引用类型属性,浅克隆仅会复制引用地址,修改克隆对象的引用属性会同步影响原对象,需要深克隆的话可通过拷贝构造函数、序列化等方式实现。
内容的提问来源于stack exchange,提问作者VA1267
相关产品推荐
相关产品推荐

