2011-01-19 80 views
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() 
     }); 

編輯: 和意志類似的語句allays是相同的,如果我用第一種語法或第二語法

+0

你不需要圍繞`session`括號。 – SLaks 2011-01-19 20:59:52

回答

5

在編譯過程中,編譯器會將第一個方法轉換爲第二個方法。

但是,如果使用一個普通的select子句創建一個不平凡的查詢表達式,則不會發出Select調用。
因此,每個下面對expresisons的將相同的編譯:

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) 
1

是。儘管ConnectedUsers之後不需要括號。

+0

感謝提示 – 2011-01-19 20:56:20

+0

我看到你也需要一些填充文本:) – leppie 2011-01-19 20:56:47

4

是的。

編譯它,並查看IL中的生成代碼或通過反射器。