2

クエリを実行したいリストにいくつかのデータがあります。ただし、その間、他のユーザーがこのリストに追加する可能性があり、その見返りに間違ったアイテムが表示されます。

var query = from s in selected
            where s.contains("www")
            select s);

次に、ユーザーはクエリを実行する前に選択したリストにアイテムを追加できます。これも取得します。この動作を防ぐことはできますか?:

selected.add("123www")

foreach (var s in query)
/// gives me 123www
4

3 に答える 3

7

var "query" にはクエリが割り当てられているだけですが、たとえば foreach ループでクエリにアクセスすると、クエリ自体が最初に実行されるため、新しく追加されたデータが取得されます。

これを望まない場合は、コレクションが同じままである "ToList()" のような拡張メソッドを使用できます。

var queryResultList = (from s in selected
             where n.contains("www")
             select s).ToList();

ここで、ToList() はコレクションをすぐに反復し、queryResultList を反復して正しい結果を得ることができ、新しい要素が到着しても出力は同じままです。

于 2013-02-26T19:36:26.210 に答える
0

クエリはアクションを表しており、いつでもトリガーでき、データのソースが変更された場合は異なる結果が得られます。

.ToArray() を使用して、必要なときに結果の「スナップショット」を作成するだけです。

var query = from s in selected
                Where s.contains("www")
                Select s)
string[] snapshot = query.ToArray();
于 2013-02-26T19:38:07.717 に答える
0

呼び出し時.ToList()または.ToArray()クエリが実行されたとき。したがって、問題を回避するには、次のコードを記述できます。

var query = from s in selected
            where s.Contains("www")
            select s);

var result = query.ToList();
selected.Add("123www");

foreach(var item in result)
{
     /* You won't see "123www" */
}
于 2013-02-26T19:50:03.350 に答える