2

次のlinqステートメントがあります:

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

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

if 条件で。

最初のものは読みやすく、2 番目のものよりも論理的に見えますが、どちらも問題なく動作します。

#1 を #2 よりも多く使用する理由、またはその逆を使用する理由はありますか?

編集:最初のものより少し良いように見えるので、2番目のものに固執します. 読みやすく、より自然に聞こえます...実際、コードで2番目のものをより頻繁に見つけました(簡単に調べた後)

4

3 に答える 3

8

はい、どちらも同じです。

#1 を #2 よりも多く使用する理由、またはその逆を使用する理由はありますか?

Anyわかりやすくするために、IMOの 2 番目のバージョンは明確です。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 ではデータベースへの呼び出しが 1 つしか生成されませんが、2 つのメソッド呼び出しがあるため、一部の最適化されていない ORM がデータベースへの 2 つの呼び出しを生成する可能性があることに技術的に留意してください。私は見たり見つけたりしていませんが。

最初のものよりも安全であるため、常に2番目のものを優先してください。

于 2013-11-04T16:16:47.593 に答える