0

linq クエリで使用される TAKE キーワードは、評価時にその linq クエリの実行を短絡させますか、それとも.Any メソッドは短絡を引き起こしますか?

value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any
4

2 に答える 2

0

ここでは短絡という用語は実際には当てはまりません。ブール値の評価に関するものだからです。ここでいくつかの例を参照してください。Takeブール値を返さないため、適用されません。

おそらくあなたが尋ねたいのは、次のメソッドが並んでいるTake場合に実行しますか? Any論理的には、最初の一致が見つかった後に停止するため、 も実行されているTake場合はスキップできます。AnyAny

ただし、連続して呼び出されるいくつかの拡張メソッドを見ているだけです。

value = MyDataTable.AsEnumerable() _
       .Where(Function(DateRow) DataRow.Item("MyColumn").ToString = "Y") _
       .(Take(1)) _
       .Any()

SoTakeが実行され、この場合はAny. Take実行する必要がないことをどのように知ることができますか? これは、ソース コードから独自の拡張メソッドを作成し、トレース ステートメントを追加すると、簡単に実証できます。

おそらく、根底にある質問は、パフォーマンスに関して重要ですか? まあ、それは 2 回の繰り返し (トップ) 対 1 回です。これを防止しようとすると、マイクロ最適化になります。

于 2016-12-03T12:00:53.970 に答える