2

我有以下 linq 语句:

_champs.Where(a => a.NoPage == noPage + 1).Any()

_champs.Any(a => a.NoPage == noPage + 1)

在 if 条件下。

第一个对我来说看起来更容易阅读,并且看起来比第二个更符合逻辑,但两者都工作得很好。

是否有任何理由使用 #1 多于 #2 或反之亦然?

编辑:我会坚持第二个,因为它看起来比第一个好一点。它也很容易阅读并且听起来更自然......实际上我在我的代码中更频繁地找到了第二个(在快速查找之后)

4

3 回答 3

8

是的,他们都是平等的。

是否有任何理由使用 #1 多于 #2 或反之亦然?

为了清楚起见,第二个版本Any很清楚,IMO。因为它显示了代码正在寻找Any实例存在的意图。

于 2013-11-04T14:56:21.467 回答
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 可能会生成两次对数据库的调用,因为有两个方法调用,虽然我没有看过或找到任何东西。

总是喜欢第二个,因为它比第一个更安全。

于 2013-11-04T16:16:47.593 回答
0

They are equal and will high-probably be optimized to the same expression tree.

于 2013-11-04T14:58:26.783 回答