我该如何解释这段代码?

时间:2010-08-06 21:38:05

标签: c# linq

<。>在.net中,可以写:

(from n in numbers where n == 5 select n).ToList();

没有这些括号,就无法调用ToList()方法。我怎么能向某人解释这条线的作用(我只能说它是预编译查询,但我不知道这是否真的100%正确)。

8 个答案:

答案 0 :(得分:6)

from n in numbers where n = 5 select n实际上是numbers.Where(n => n == 5)的语法糖。因此,您使用LINQ表达式将数字列表过滤为等于5的数字。

然而,

LINQ评估 lazy 。这意味着numbers.Where(n => n == 5) IEnumerable )返回的对象等于五的数字列表。该列表仅在需要时创建,即,在尝试访问 IEnumerable 的元素时。

ToList将此IEnumerable的内容复制到列表中,这意味着必须立即对表达式进行求值。

答案 1 :(得分:5)

括号中的括号可以解析.ToList()只能引用n的解析器。

答案 2 :(得分:2)

在LINQ中,默认情况下,所有查询都是延迟加载的。也就是说,在枚举您的集合之前,查询本身已被解析但未运行。

ToList()强制对集合“numbers”进行枚举,然后运行查询。

答案 3 :(得分:1)

在我看来,就像括在括号中的LINQ表达式一样,其结果为IEnumerable<int>,然后调用IEnumerable<T>扩展方法ToList<T>()

我认为在这种情况下,调用ToList<T>会强制立即评估表达式,基本上是对评估的任何懒惰。

Eric White撰写了一篇关于 Lazy (and Eager) Evaluation with LINQ

的好文章

答案 4 :(得分:1)

它会将IEnumerable<t>转换为List<t>

答案 5 :(得分:1)

如果您更改它以直接使用扩展方法,您可能会更容易向不熟悉LINQ的人解释。

numbers.Where(number => number == 5).ToList();

对于像这样的简单案例,这变得更加明显。

答案 6 :(得分:0)

更熟悉LINQ的人可能会纠正我,但我的理解是LINQ表达式本身不一定会被评估,直到你用它“做某事”。因此,如果您想立即评估它,那么您将调用ToList()。 (它也将它从IEnumerable转换为IList,而不仅仅是评估它。)

当然,它包含在括号中,告诉编译器ToList()'ed'的全部范围。

答案 7 :(得分:0)

括号将表达式分组为逻辑原子值。

这类似于算术

1 + 1 * 2 = 4不! (= 3)

(1 + 1) * 2 = 4是的!