2011-10-04 7 views
9

パブリッシュ/サブスクライブアーキテクチャでメッセージのリストがある場合、特定のメッセージを取得してメッセージの順序を信頼するために、基礎となるリストでIEnumerable.Whereを使用することは合理的です。LINQ拡張メソッドはどこに保障されていますか?

+0

実際には、「IEnumerable.Where」というメソッドはありません。 IEnumerable を受け入れる 'Enumerable.Where'拡張メソッドがあります。しかし、指定された列挙型に対して、与えられたLINQクエリが異なるものを使用することは完全に可能です。そして、それは、注文を保存するか、または注文を保存しない方法で実装することができます。 –

+0

私はそれがメンバーではなく拡張方法であることを知っています。それは書くだけで簡単だったと私は誰もlinq拡張メソッドについて知っていると仮定します。 – LinusK

+0

与えられた列挙型は、列挙する参照の型に応じて、 'Enumerable.Where()'の代わりに使用される独自の 'Where()'メソッドを定義するかもしれません。 –

答えて

20

Enumerable.Where拡張方法ですが、Queryable.Where拡張方法はありません。

Enumerable.Whereは、結果をストリームし、キャッシュがなく(キャッシング結果にロジックがないため)、順序を保持する必要があります。

Queryable.Whereは、指定されたクエリを基礎となるデータソースが理解するものに変換します。したがって、これまでのものを順序付けすることについての保証はありません。この効果は、リレーショナルデータベースを使用して作業するときに容易に確認できます。 where句を追加すると、データベースで別のインデックスを選択できるため、結果の順序が変更される可能性があります。

+0

確かに、LINQ to Entitiesは '.Where() 'の後に* * *の順序を保持しないように文書化されています –

+4

' Enumerable.Where'は現在のところ順序を保持していますが、インターフェイスのドキュメントには。もちろん、あなたが 'ParallelEnumerable'を使っているならば、全てのベットはオフになっています。 –

+1

@ Jim: 'Enumerable.Where'のドキュメントには順序を保持するとは言いませんが、順序が常に保持されると想定するのは安全だと思います。開発者は依存しています。 – Steven

7

Linq to Objects/IEnumerableこれは本当です - 注文は維持されます - IQueryableプロバイダーによって異なりますが、多くのプロバイダーは注文を維持しません。

MSDNではこの事実(保守指図)は文書化されていないようですので、将来は変わるかもしれない実装の詳細と考えています。

+0

'IEnumerable'のインタフェースは、順序を保持するために文書化されていますか?それとも、私たちは「知っている」のだろうか? –

+0

@Jim、 'IEnumerable'は' Where'をまったく持っていません。これは拡張メソッドとクエリパターンですが、インターフェイスのメンバーではありません。 –

+0

@CraigStuntz:Fine。 'Enumerable.Where'、それから。注文を保存すると書かれた文書はありません。 –

関連する問題