Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这两个linq是否相等?_C#_Linq - Fatal编程技术网

C# 这两个linq是否相等?

C# 这两个linq是否相等?,c#,linq,C#,Linq,我有以下linq声明: _champs.Where(a => a.NoPage == noPage + 1).Any() 及 处于if状态 第一个看起来更容易阅读,似乎比第二个更符合逻辑,但两者都很好 是否有任何理由使用1多于2,或者反之亦然 编辑:我将坚持第二个,因为它似乎比第一个好一点。它也很容易阅读,听起来更自然。。。事实上,我在我的代码中更经常地找到第二个(快速查找后)是的,它们都相等 是否有任何理由使用1多于2,或者反之亦然 为清楚起见,IMO第二个版本中的Any很清楚,因为它

我有以下linq声明:

_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);
        }
    }
}