C#:方法参数场景下的空条件运算符简写方案问询
简化“找到非空项再添加到列表”的代码方案
嘿,这个问题提得很实用——我们确实经常遇到这种“找到东西才添加”的场景,原代码里两次调用Find不仅冗余,还可能影响性能(虽然List.Find是线性查找,小列表差异不大,但好习惯得养成)。先给你梳理几种更优的简写方式:
1. 先缓存查找结果(最直观的基础优化)
先把Find的结果存到变量里,避免重复调用,代码也更清晰:
var foundItem = anotherList.Find(somePredicate); if (foundItem != null) { someList.Add(foundItem); }
这种方式的好处是:如果后续还要用到找到的foundItem,直接用变量就行,而且逻辑一目了然,新手也能快速理解。
2. 利用LINQ简化(一行搞定,无需额外扩展)
如果你熟悉LINQ,可以用Where+Take(1)配合AddRange,因为AddRange会处理空序列,不用手动判断null:
someList.AddRange(anotherList.Where(somePredicate).Take(1));
Where(somePredicate)会筛选出符合条件的所有项,Take(1)只取第一个(和Find的行为一致),如果没有符合条件的项,AddRange就什么都不做,完美替代原逻辑。
3. 结合空条件运算符+你的扩展方法(更简洁的一行写法)
你写的AddTo扩展方法其实已经很实用了,再结合C# 6+的空条件运算符?.,可以直接写成一行:
anotherList.Find(somePredicate)?.AddTo(someList);
如果Find返回null,?.会直接跳过后面的AddTo调用,完全符合你的需求,代码极简。
各方案对比
- 缓存变量:适合需要复用查找结果的场景,可读性拉满。
- LINQ方式:无需自定义扩展,依赖.NET内置方法,适合纯添加的场景。
- 空条件+扩展:代码最简洁,和你的初始思路契合,适合已经有扩展方法的项目。
内容的提问来源于stack exchange,提问作者Zachary




