(from n in numbers where n == 5 select n).ToList();
没有这些括号,就无法调用ToList()方法。我怎么能向某人解释这条线的作用(我只能说它是预编译查询,但我不知道这是否真的100%正确)。
答案 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>
会强制立即评估表达式,基本上是对评估的任何懒惰。
答案 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
是的!