11

(漸近的な)パフォーマンスに違いはありますか?

var a = Orders.OrderBy(order => order.Date).First()

var y = Orders.Where(order => order.Date == Orders.Min(x => x.Date)).ToList();

つまり、First()はOrderBy()を実行しますか?いいえと思います。MSDNによると、GetEnumeratorを介してコレクションを列挙することはできますが、言い回しは他の拡張機能を除外しません。

4

4 に答える 4

11

いくつかのこと:

  • OrderBy()小さいものから大きいものへの注文なので、2つの選択肢は異なる要素を返します
  • Where()通常は怠惰であるため、2番目の式は実際にはまったく計算を行いません-使用されるまでは。
  • 原則として、問題の動作はクエリプロバイダーによって異なります。たとえば、sql-serverlinqクエリプロバイダーがIEnumerableクエリプロバイダーとは異なる方法でこれを処理することを実際に期待する場合があります。クエリプロバイダーは、「OrderBy」の戻り値を十分に特殊化して、呼び出し元First()が(コンパイル時または実行時に)順序付けられた列挙可能オブジェクトで実行されていることを認識し、並べ替えの代わりに(最初の)最小要素。
  • 特にIEnumerable<T>プロバイダーのOrderBy場合、最初の要素が取得されるたびに入力を完全にバッファリングおよびソートする列挙型を返します。したがって、一般的な基本的なLinq-to-objectsの場合は、OrderBy().First()に相当しOrderBy().ToArray()ます。

linqは単なる関数名の集まりであることに注意してください。各プロバイダーはこれらを異なる方法で実装することを選択できるため、上記はSystem.Linq IEnumerableクエリプロバイダーにのみ当てはまり、必ずしも他のプロバイダーには当てはまりません。

于 2010-03-16T14:45:18.600 に答える
6

First渡されたIEnumerableの最初のエントリを返します。渡されたIEnumerableは質問Firstの結果であるため、OrderBy「機能しますか」と言い換えることができますOrderBy。そうです。

FirstOrderBy結果をすぐに返すため、の実行を延期することはできません。例えば:

        var numbers = new int[] { 9, 3, 4, 6, 7 };

        var num = numbers.First();
        Console.WriteLine(num);

        num = numbers.OrderBy(i => i).First();
        Console.WriteLine(num);

        Console.ReadLine();
于 2010-03-16T14:21:04.757 に答える
6

Firstメソッドは実行します(OrderByつまり、Firstメソッドが実行されている場合)。Firstメソッドがの結果から最初のアイテムをプルするとき、OrderByすべてのアイテムをソートして、どれが最初のアイテムであるかを見つける必要があります。

クエリが実行される場所と方法によっては(つまり、クエリエンジンがクエリを最適化できない場合)、2番目のクエリのパフォーマンスが大幅に低下する可能性があります。Orders.Maxの項目ごとに1回評価すると、O( n Orders* n)演算になり、かなり悪いです。

機能的な違いもあります。日付が重複している場合、2番目のクエリは複数のアイテムを返す可能性があります。

于 2010-03-16T14:24:42.300 に答える
0

そうではありません。言われていること-当然、orderbyは、誰かが実際に最初の要素を取得しようとした瞬間に実行されます。

しかし、あなたが言ったように、条件はさらに定義されるかもしれません。そのため、いいえ-その時点では実行されません。

于 2010-03-16T14:19:47.753 に答える