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向现有列表添加额外的项目将使它们显示在查询中,但更改变量的值以完全引用不同的列表不会有任何效果。基本上,如果您在心理上将查询从查询​​表达式扩展为“正常”形式,则 lambda 表达式中存在的任何变量都将被捕获为变量,但任何直接作为参数存在的变量都将立即被计算。这只会捕获变量的参考值,而不是列表中存在的项目,但这仍然意味着更改变量值本身不会被看到。您的第一个查询扩展为:

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