C# 这两个linq是否相等?
我有以下linq声明:C# 这两个linq是否相等?,c#,linq,C#,Linq,我有以下linq声明: _champs.Where(a => a.NoPage == noPage + 1).Any() 及 处于if状态 第一个看起来更容易阅读,似乎比第二个更符合逻辑,但两者都很好 是否有任何理由使用1多于2,或者反之亦然 编辑:我将坚持第二个,因为它似乎比第一个好一点。它也很容易阅读,听起来更自然。。。事实上,我在我的代码中更经常地找到第二个(快速查找后)是的,它们都相等 是否有任何理由使用1多于2,或者反之亦然 为清楚起见,IMO第二个版本中的Any很清楚,因为它
_champs.Where(a => a.NoPage == noPage + 1).Any()
及
处于if状态
第一个看起来更容易阅读,似乎比第二个更符合逻辑,但两者都很好
是否有任何理由使用1多于2,或者反之亦然
编辑:我将坚持第二个,因为它似乎比第一个好一点。它也很容易阅读,听起来更自然。。。事实上,我在我的代码中更经常地找到第二个(快速查找后)是的,它们都相等 是否有任何理由使用1多于2,或者反之亦然
为清楚起见,IMO第二个版本中的
Any
很清楚,因为它显示了代码寻找Any
实例存在的意图。它们是相等的,很可能会优化到相同的表达式树。它们是等价的,但不相等的
它们将返回相同的结果,但编译器生成不同的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();
}
}
}
使用System.Collections.Generic;
使用System.Linq;
命名空间控制台应用程序3
{
班级计划
{
静态void Main()
{
var_champs=新列表();
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);
}
}
}
使用System.Collections.Generic;
使用System.Linq;
命名空间控制台应用程序3
{
班级计划
{
静态void Main()
{
var_champs=新列表();
var-noPage=0;
var q=_champs.Any(a=>a.NoPage==NoPage+1);
}
}
}
虽然这对于LinqToObjects来说实际上不是问题,对于EntityFramework等许多ORM来说,它只会生成一个对数据库的调用,但请记住,从技术上讲,一些未优化的ORM可能会生成两个对数据库的调用,因为有两个方法调用,尽管我没有查看或发现任何方法调用
总是喜欢第二个,因为它比第一个更安全。使用
2
更方便、简洁,当然我们应该使用它。顺便说一句,我发现第二个比第一个更容易阅读。从技术上讲,2
可能会快一点,因为1
需要创建一个WhereEnumerableTerator
的实例。但是我不相信你能观察到这种差异。我曾经偶然发现以下错误:\u champs.Select(a=>a.NoPage==NoPage+1.Any()
。由于短语“Select”的含义,很容易忽略这样一个事实,即它不能按预期的方式工作!完整的解释留给观众作为一个简单的练习。我建议使用简明版本。如果这是纯Linq to Objects,即使用委托Func
处理Enumerable
,则不存在表达式树。在这种情况下,它将不会被优化到相同的事情。他的第一个版本不如第二个版本直接。这就是为什么“可能”:
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);
}
}
}