我有以下linq声明:
_champs.Where(a => a.NoPage == noPage + 1).Any()
和
_champs.Any(a => a.NoPage == noPage + 1)
在if条件下。
第一个看起来更容易为我阅读,看起来比第二个更合乎逻辑,但两者都工作得很好。
是否有任何理由使用#2而不是#2或反之亦然?
编辑:我会坚持第二个,因为它看起来比第一个好一点。它也很容易阅读,听起来更自然......实际上我在代码中经常找到第二个(快速查找后)
答案 0 :(得分:8)
是的,两者都相等。
是否有任何理由使用#2而不是#2或反之亦然?
为清楚起见,Any
的第二个版本很清楚,IMO。因为它显示代码正在寻找Any
实例的存在的意图。
答案 1 :(得分:1)
它们等效但不等于
它们将返回相同的结果,但编译器会生成不同的IL。 (即使在发布模式下也不会优化。)
对于此代码:
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication3
{
class Program
{
static void Main()
{
var _champs = new List<Champ>();
var noPage = 0;
var q = _champs.Where(a => a.NoPage == noPage + 1).Any();
}
}
}
对于这个:
using System.Collections.Generic;
using System.Linq;
namespace ConsoleApplication3
{
class Program
{
static void Main()
{
var _champs = new List<Champ>();
var noPage = 0;
var q = _champs.Any(a => a.NoPage == noPage + 1);
}
}
}
虽然这对LinqToOjects来说实际上不是问题,但对于像EntityFramework这样的许多ORM,它只会生成一次对数据库的调用,请记住,从技术上讲,一些未经优化的ORM可以生成两次数据库调用,因为有两个方法调用,虽然我没有查找或发现任何。
总是更喜欢第二个,因为它比第一个更安全。
答案 2 :(得分:0)
它们是相同的并且很高 - 可能会针对相同的表达式树进行优化。