19

実際、これはこの投稿と同じ質問です。

DAL で呼び出されたときに LINQ クエリが遅延なく実行されるようにするにはどうすればよいですか?

しかし、彼がなぜそれを望んだのかを説明しなかったので、その質問は少し見過ごされたようです. これが私の同様の、しかしよりよく説明された問題です:

2 種類のスレッドがいくつかあります (UI スレッドはしばらく無視します)。「データ収集」スレッド タイプと「計算」スレッド タイプがあります。データ収集スレッドが遅い。さまざまな場所からふるいにかけられるかなりの量のデータがあります。計算スレッドは比較的高速です。この時点までの設計モデルは、データ収集スレッドを送信してデータを検索し、それらが完了すると計算のためにデータを渡すことです。

Linq でデータ収集をコーディングしたとき、その遅さの一部を計算スレッドに巻き戻すことになりました。現在、計算中に使用されるまで完全に解決されないデータ要素があります。これが問題です。

Linq に特定の時間 (ステートメントの終わり? メソッドの終わり? 「終了してください、くそー」メソッド呼び出し) で作業を終了させて​​、後で支払う必要がないことを知りたいと思います。Linq の最後に ".ToList()" を追加するのは 1. 厄介です。

4

4 に答える 4

24

何もボクシングすることはありません-結果をバッファリングすることになります。

ToList()実際にデータが必要な場合は、基本的に使用する方法です。データをすぐに使用する準備ができていない限り、どこかにバッファリングする必要がありますね。リストはそのための便利な方法です。

別の方法は、その場で処理を行うことです。作成したデータを熱心に使用します。私は物事のさまざまなスレッドの側面を完全には追っていなかったので、それがあなたに役立つかどうかはわかりませんが、基本的には、私が見る限り、それらはあなたが利用できる選択肢です.

これは実際にはあなたの説明でいくらか明示的です:

この時点までの設計モデルは、データ収集スレッドを送信してデータを検索し、それらが完了すると計算のためにデータを渡すことです。

呼び出しToList()は基本的に、「要求されたときにデータをフェッチできるクエリ」から「リストにバッファリングされたデータ自体」に返すものを変更します。

于 2009-06-30T14:42:11.717 に答える
7

.ToList が受け入れられない理由をもっと説明できますか? ボックス化とボックス化解除について言及しましたが、それらはまったく関係のないトピックです。

LINQ クエリをオンデマンドで強制的に完了するには、結果を保存する必要があります。それ以外の場合、結果を再度表示するには、クエリを再処理する必要があります。.ToList は、要素を .ToList に格納することでこれを効率的に実現しList<T>ます。

必要に応じてさまざまなトレードオフを考慮して、実質的に他のコレクション スタイルのデータ構造に要素を格納することができます。

于 2009-06-30T14:42:14.040 に答える
0

クラスには、データをより熱心にフェッチするのに役立つLoadOptionsプロパティがあります。DataContext

それ以外の場合は、いくつかの巧妙な配置を使用できますToList()

于 2009-06-30T14:42:49.140 に答える
-6

私はこのスレッドが古いことを知っています... とにかく、面白いことに誰も言及していません .ToLast() まだ。私は、linqが、クエリの結果をあまり気にしないいくつかの副作用を引き起こす、美化されたforeach以上のものではないことを行っています...したがって、必要以上に偽のメモリを割り当てたくありませんでした。

于 2011-02-09T22:41:41.167 に答える