2016-12-01 7 views
0

linqクエリで使用されるTAKEキーワードは、評価されたときにそのlinqクエリの実行を短絡させますか、それともどの方法でも短絡が発生しますか?.NETのLINQキーワード「TAKE」が短絡していませんか?

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

両方。テイクは最初の1レコードだけを取るでしょう、そして、anyは一致するものを見つけるとすぐに短絡します(ただし、テイクのために最大で1つです)。テイク1を安全に取り外して、同じ性能を持たせることができます。 –

+0

驚くばかり、答えてくれてありがとう! –

+0

@RobertMcKeeそれは答えではありません... –

答えて

1

両方。テイクは最初の1レコードだけを取るでしょう、そして、anyは一致するものを見つけるとすぐに短絡します(ただし、テイクのために最大で1つです)。テイク1を安全に取り外して、同じ性能を持たせることができます。

0

短絡は約boolean evaluationであるため、実際には適用されません。いくつかの例を参照してくださいhereTakeはブール値を返さないため、適用されません。

おそらく、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つ、それがマイクロ最適化されないようにしようとしています。

関連する問題