这两个陈述意思相同吗?

3
以下两个语句是否完全相同,包括像延迟绑定这样的副作用?
Ilist<SomeClass> sessions = SomeFunction()
var tmp = from session in sessions
          select new ConnectedUsers()
              {
                  ID = session.SessionId,
                  Username = session.UserName,
                  HostName = session.ClientName,
                  IpAddress = session.ClientIPAddress.ToString()
              };
var tmp2 = sessions.Select((session) => new ConnectedUsers() 
        { 
            ID = session.SessionId, 
            Username = session.UserName, 
            HostName = session.ClientName, 
            IpAddress = session.ClientIPAddress.ToString() 
        });

编辑: 如果我使用第一种语法或第二种语法,类似的语句是否总是相同。

你不需要在 session 周围加上括号。 - SLaks
3个回答

5
编译器将在编译过程中将第一个方法转换为第二个方法。但是,如果您使用琐碎的select子句创建非琐碎的查询表达式,则不会发出Select调用。因此,以下每对表达式将编译相同:
from x in Enumerable.Range(0,1000) where x / 2 == x / 2.0 select x
Enumerable.Range(0,1000).Where(x => x / 2 == x / 2.0)  //No Select call

from x in Enumerable.Range(0,1000) select x
Enumerable.Range(0,1000).Select(x => x)

你确定最后一个发出的是Select吗?除非你(或编译器)想确保你得到可枚举对象的副本,否则似乎有点毫无意义。 - leppie
@leppie:是的,我试过了。整个表达式有点毫无意义。 - SLaks

4

可以。

将其编译并查看通过IL或Reflector生成的代码。


1

是的。虽然在ConnectedUsers后面不需要括号。


我看到你也需要一些占位文本 :) - leppie
有点主观,但我认为你应该始终这样做,并且在非无参数情况下保持一致。 ;) - user541686
1
@leppie 虽然我讨厌最小化,但我也不喜欢不必要的代码。 - Yuriy Faktorovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接