如何在单个LINQ操作中仅当匹配元素存在时执行对应方法
实现方案
方案1:空条件运算符+FirstOrDefault(C# 6及以上版本支持,推荐)
直接将筛选逻辑放到FirstOrDefault的参数中,搭配空条件运算符?.即可实现需求:匹配不到元素时?.后的逻辑会自动短路不执行,不会抛出任何异常,且整个过程仅遍历集合1次,性能优于你当前的两次遍历写法。
// 单句实现需求,无匹配时不会执行someOperation list.FirstOrDefault(x => x.property == "valueNotInTheList")?.someOperation();
方案2:自定义通用扩展方法(适配复杂操作场景)
如果后续要执行的逻辑比较复杂,你可以封装专用的LINQ扩展方法复用逻辑:
// 自定义扩展方法 public static class EnumerableExtensions { public static void ExecuteIfMatch<T>(this IEnumerable<T> source, Func<T, bool> predicate, Action<T> operate) where T : class { var target = source.FirstOrDefault(predicate); if (target != null) operate(target); } } // 调用示例 list.ExecuteIfMatch(x => x.property == "valueNotInTheList", x => x.someOperation());
额外说明
如果你的元素是值类型,需要将FirstOrDefault的结果转为对应可空类型后再使用?.运算符,引用类型场景直接使用上述写法即可。
内容的提问来源于stack exchange,提问作者SolarOsQuiere
相关产品推荐
相关产品推荐

