6

私はLinqで何ができるかを実験してきましたが、これまでのところ本当に気に入っています:)

アルゴリズムのクエリをいくつか作成しましたが、期待した結果が得られませんでした...列挙型は常に空を返しました。

ケース#1

List<some_object> next = new List<some_object>();
some_object current = null;

var valid_next_links =
    from candidate in next
    where (current.toTime + TimeSpan.FromMinutes(5) <= candidate.fromTime)
    orderby candidate.fromTime
    select candidate;

current = something;
next = some_list_of_things;

foreach (some_object l in valid_next_links)
{
    //do stuff with l
}

クエリ宣言を次のようにインラインに変更しましたが、正常に機能しました。

ケース#2

 foreach (some_object l in
      (from candidate in next
       where (current.toTime + TimeSpan.FromMinutes(5) <= candidate.fromTime)
       orderby candidate.fromTime
       select candidate))
 {
  //do stuff with l
 }

ケース#1でなぜそれが機能しないのか誰かが知っていますか?私の理解では、あなたがそれを宣言したときにクエリは評価されなかったので、どのように違いがあるのか​​わかりません。

4

1 に答える 1

7

への変更currentはキャプチャされますが、クエリはすでに。のを認識していますnext。既存のリストに項目を追加すると、それらはクエリに表示されますが、変数の値を変更して別のリストを参照しても、まったく効果はありません。基本的に、クエリをクエリ式から「通常の」形式に精神的に拡張すると、ラムダ式に存在する変数はすべて変数としてキャプチャされますが、引数として直接存在する変数はすぐに評価されます。これは、リストに存在する項目ではなく、変数の参照値のみをキャプチャしますが、それでも変数値自体の変更は表示されないことを意味します。最初のクエリは次のように展開されます。

var valid_next_links = next
      .Where(candidate => (current.toTime + TimeSpan.FromMinutes(5) <= candidate.fromTime))
      .OrderBy(candidate => candidate.fromTime);
于 2012-06-19T13:15:19.423 に答える