linqクエリで使用されるTAKEキーワードは、評価されたときにそのlinqクエリの実行を短絡させますか、それともどの方法でも短絡が発生しますか?.NETのLINQキーワード「TAKE」が短絡していませんか?
value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any
linqクエリで使用されるTAKEキーワードは、評価されたときにそのlinqクエリの実行を短絡させますか、それともどの方法でも短絡が発生しますか?.NETのLINQキーワード「TAKE」が短絡していませんか?
value = (From DataRow In MyDataTable Where DataRow.Item("MyColumn").ToString = "Y" Take 1).Any
両方。テイクは最初の1レコードだけを取るでしょう、そして、anyは一致するものを見つけるとすぐに短絡します(ただし、テイクのために最大で1つです)。テイク1を安全に取り外して、同じ性能を持たせることができます。
短絡は約boolean evaluationであるため、実際には適用されません。いくつかの例を参照してくださいhere。 Take
はブール値を返さないため、適用されません。
おそらく、Any
が次の方法である場合、Take
が実行されますか?論理的には、Any
も実行された場合は、が表示されます。Any
も最初の一致が検出された後に停止するためです。
しかし、私たちは連続と呼ばれる拡張メソッドのカップル、見ている:この場合Any
には、次の来ることを起こるものは何でも方法、その後
value = MyDataTable.AsEnumerable() _
.Where(Function(DateRow) DataRow.Item("MyColumn").ToString = "Y") _
.(Take(1)) _
.Any()
のでTake
実行、および。 Take
は実行する必要はありません。これは、source codeから独自の拡張メソッドを作成し、トレースステートメントを追加すると簡単に実証できます。
おそらく根本的な問題はパフォーマンス面で重要なのでしょうか?まあ、それは2つの反復(上)対1つ、それがマイクロ最適化されないようにしようとしています。
両方。テイクは最初の1レコードだけを取るでしょう、そして、anyは一致するものを見つけるとすぐに短絡します(ただし、テイクのために最大で1つです)。テイク1を安全に取り外して、同じ性能を持たせることができます。 –
驚くばかり、答えてくれてありがとう! –
@RobertMcKeeそれは答えではありません... –