关于allhuman.RemoveAll(s => s == null)含义及等效代码替换的疑问
代码含义与替换分析
一、allhuman.RemoveAll(s => s == null)的含义
这是C#中List<T>等集合类型的内置方法,作用是一次性移除集合中所有符合指定条件的元素:
s => s == null是Lambda表达式,用来定义筛选规则——匹配所有值为null的元素;RemoveAll方法内部会高效遍历整个集合,批量移除所有满足条件的元素,不会出现索引错位的问题,性能和代码简洁性都优于手动循环。
二、能否用给出的for循环替换?
不能直接替换,因为这个for循环存在逻辑漏洞:
当执行allhuman.RemoveAt(i)删除元素后,集合的元素会向前移位,同时Count值减1,但循环变量i仍会自增,导致跳过被删除元素的下一个元素。比如集合为[null, null, "张三"]时:
i=0删除第一个null,集合变为[null, "张三"];i自增到1,此时判断的是allhuman[1](即"张三"),不会删除,循环结束,但集合中剩余的null未被处理。
如果想用for循环实现相同效果,需要从后往前遍历,避免索引错位:
for (int i = allhuman.Count - 1; i >= 0; i--) { if (allhuman[i] == null) { allhuman.RemoveAt(i); } }
内容的提问来源于stack exchange,提问作者利维坦
相关产品推荐
相关产品推荐

