C# LINQ性能疑问:Any子句中扩展方法是否每次迭代都执行
关于LINQ中
ConvertToString()是否重复执行的问题解答 答案是肯定的——searchId.ConvertToString()会在遍历itemCollection的每个元素时都被执行一次。
原因分析:
你把ConvertToString()的调用放在了Any方法的lambda表达式里,而LINQ的Any是延迟执行的:它会逐个枚举itemCollection中的元素,每检查一个item,就会完整执行一次lambda里的逻辑。这意味着哪怕searchId是固定的int值,每次迭代都会重新调用一次转换方法,生成相同的字符串结果。
优化建议:
既然searchId的值不会在遍历过程中改变,完全可以提前把转换后的字符串计算好,放在Any外面,这样转换操作只会执行一次,能避免不必要的重复计算(尤其是当集合元素很多的时候,这点优化会更明显):
public static bool CheckIdExists(int searchId) { // 提前转换,只执行一次 string searchIdStr = searchId.ConvertToString(); return itemCollection.Any(item => item.Id.Equals(searchIdStr)); }
这种写法不仅性能更好,代码的可读性也更强——一眼就能看出searchIdStr是个固定值,不会在迭代中变化。
内容的提问来源于stack exchange,提问作者Abdul Hameed
相关产品推荐
相关产品推荐

