linq クエリで使用される TAKE キーワードは、評価時にその linq クエリの実行を短絡させますか、それとも.Any メソッドは短絡を引き起こしますか?
value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any
ここでは短絡という用語は実際には当てはまりません。ブール値の評価に関するものだからです。ここでいくつかの例を参照してください。Take
ブール値を返さないため、適用されません。
おそらくあなたが尋ねたいのは、次のメソッドが並んでいるTake
場合に実行しますか? Any
論理的には、最初の一致が見つかった後に停止するため、 も実行されているTake
場合はスキップできます。Any
Any
ただし、連続して呼び出されるいくつかの拡張メソッドを見ているだけです。
value = MyDataTable.AsEnumerable() _
.Where(Function(DateRow) DataRow.Item("MyColumn").ToString = "Y") _
.(Take(1)) _
.Any()
SoTake
が実行され、この場合はAny
. Take
実行する必要がないことをどのように知ることができますか? これは、ソース コードから独自の拡張メソッドを作成し、トレース ステートメントを追加すると、簡単に実証できます。
おそらく、根底にある質問は、パフォーマンスに関して重要ですか? まあ、それは 2 回の繰り返し (トップ) 対 1 回です。これを防止しようとすると、マイクロ最適化になります。