2013-10-22 236 views
4

內臨時變量我有類似下面這樣的LINQ聲明:匿名類型

 var entities = from row in table.AsEnumerable() 
            select new 
            { 
             ID = row.ID, 
             X = GetObjectByProcessingID(row.ID)[0], 
             Y = GetObjectByProcessingID(row.ID)[1], 
             .... 
            }; 

是否可以做這樣的事情:

 var entities = from row in table.AsEnumerable() 
            select new 
            { 
             private var tmp = GetObjectByProcessingID(row.ID), 
             ID = row.ID, 
             X = tmp[0], 
             Y = tmp[1], 
             .... 
            }; 

爲了避免調用GetObjectByProcessingID兩次?

我知道你可以這樣做:

 var entities = from row in table.AsEnumerable() 
            select new 
            { 
             ID = row.ID, 
             XAndY = GetObjectByProcessingID(row.ID), 
             .... 
            }; 

但在這種情況下,它會暴露整個陣列。我也知道,我可以在方法一側(GetObjectByProcessingID)實現像緩存這樣的東西,或者創建一個幫助器方法來調用它,並記住ID是否相同的最後一個值。但是有更好的方法嗎?我可以在創建匿名類型時創建臨時變量嗎?

回答

11

使用let關鍵字如下:

var entities = table.AsEnumerable() 
        .Select(row => { 
         var tmp = GetObjectByProcessingID(row.ID); 
         return new { 
           ID = row.ID, 
           X = tmp[0], 
           Y = tmp[1], 
           .... 
           }; 
        }); 

var entities = from row in table.AsEnumerable() 
       let tmp = GetObjectByProcessingID(row.ID) 
       select new { 
          ID = row.ID, 
          X = tmp[0], 
          Y = tmp[1], 
          .... 
          }; 

您還可以使用method syntax這是非常喜歡我試試