我正在刷新LINQ,并试图理解let
和使用into
关键字之间的区别.到目前为止,就我的理解而言,let
关键字似乎比关键字更好into
.
该into
关键字实质上允许在投影后继续查询.(只是想明确说明我不是指组连接的那个.)
给定一系列名称,它允许人们执行以下操作:
var intoQuery = from n in names select Regex.Replace(n, "[aeiou]", "") into noVowel where noVowel.Length > 2 select noVowel;
它需要选择的结果,并将其放置到noVowel
变量,然后允许一个引入额外的where
,orderby
和select
条款.一旦noVowel
变量被创建,该n
变量不再可用.
该let
关键字,而另一方面,使用温度匿名类型,让你在同一时间重复使用一个以上的变量.
您可以执行以下操作:
var letQuery = from n in names let noVowel = Regex.Replace(n, "[aeiou]", "") where noVowel.Length > 2 select noVowel;
这两个noVowel
和n
变量都可以使用(即使我在这种情况下没有使用它).
虽然我可以看到差异,但我不太明白为什么人们会想要在into
关键字上使用let
关键字,除非明确要确保以前的变量不能在查询的后半部分使用.
那么,两个关键词存在的原因是否存在?
是的,因为正如你所说,他们正在做不同的事情.
select ... into
有效隔离整个查询,并允许您将其用作新查询的输入.就个人而言,我通常喜欢通过两个变量来做到这一点:
var tmp = from n in names select Regex.Replace(n, "[aeiou]", ""); var noVowels = from noVowel in tmp where noVowel.Length > 2 select noVowel;
(不可否认,在这种情况下,我会用两行中的点符号来做,但忽略了......)
通常你不想要查询的前面部分的全部行李-这是当您使用select ... into
或一分为二的查询按照上面的例子.这不仅意味着查询的早期部分不应该使用它们,它简化了正在发生的事情 - 当然这意味着每一步都可能进行更少的复制.
在另一方面,当你不希望保留的背景下休息,let
更有意义.
主要区别在于let
将变量注入上下文/范围,into
从而创建新的上下文/范围.