2013-10-03 19 views
5

他の質問here...の提案された回答に基づいて、LINQ列挙中に変数を更新してテストの一部として使用することは可能ですか?反復処理中にLINQ文内の値をリアルタイムに設定/更新できますか?

たとえば、これは可能ですか?

// Assume limitItem is of type Foo and sourceList is of type List<Foo> 

// Note the faux attempt to set limitItemFound in the TakeWhile clause 
// That is what I'm wondering. 

sourceList.Reverse() 
    .TakeWhile(o => (o != limitItem) && !limitItemFound; limitItemFound = limitItemFound || (o == limitItem)) 
    .FirstOrDefault(o => ...); 

これにより、limitItemを含む検索が行われます。オブジェクトへ

LINQのために
+0

私はこれは*可能です*と信じていますが、あなたは本当に一度、あなたが期待したとき、そしてあなたが期待する順序で評価されていることに注意する必要があります。 –

+0

もっと詳しく説明できますか? (また、私はqを更新しました。論理的な欠陥がありました) – MarqueIV

+1

FirstOrDefaultを返すだけでOKですが、IEnumerableとして保持し、基礎となる実装に応じて2回反復する場合はOKです実際にはTakeWhileを2回評価して、2回目に変数の残存値を残します。 (私は思う) –

答えて

7

代表者をとる)、あなたは、そうすることができます - ステートメントラムダ使用:

sourceList.Reverse() 
    .TakeWhile(o => { 
      ... fairly arbitrary code here 
      return someValue; 
     }) 
    .FirstOrDefault(o => ...); 

私はが強くはしかしこれをやってからあなたを思いとどまらでしょうが。 あなたは慣用的なLINQコードの宣言的性質を失っているので、何が起こっているのか分かりにくくなります。

+0

DUH! {{head-slap}}もちろんこれは正しいです!デリゲートのバージョンには、必要なことを何でもできる中括弧が含まれていることを忘れています。ありがとう! (BTW、私は明確に同意しますが、簡単なコメントで、はるかに明確になります)。 – MarqueIV

関連する問題