2016-01-04 103 views
1

我想上傳ASP.NET網站的多個文件。因此,我有以下簡單的例子:此LINQ查詢是否會枚舉整個枚舉?

public ContentResult UploadFiles(IList<HttpPostedFileBase> files) 
{ 
    if (files == null || 
     !files.Any()) 
    { 
     // Nothing uploaded. 
     return Content("No files where uploaded."); 
    } 

    myService.UploadCsvFilesToDatabaseAsync(files.Select(x => x.InputStream)); 

    return Content("Success!"); 
} 

聲明本:myService.UploadCsvFilesToDatabaseAsync(files.Select(x => x.InputStream)

我不希望通過在這一點上文件枚舉..但後來當我那個方法。

那麼,files.Select(x => x.InputStream)做任何枚舉在這一點上?或者它只是傳遞一個新的集合,其中包含每個輸入流的開始,準備枚舉。

說明:我不想從文件在這一點讀取任何數據,但稍後在裏面,該方法。

+0

看起來不應該枚舉。有一點調試可以確認,只需在lambda中放置一個斷點,然後在該方法內部放置一個斷點,並查看哪一個首先被擊中...... –

+0

它不會完成整個列表......但''。如果有的話,任何()都會帶第一個項目。 –

回答

4

那麼,文件.Select(x => x.InputStream)在這個點上做任何枚舉嗎?

NO,從Documentation

該方法引用是通過使用延遲執行實現。返回值的即時 是一個對象,用於存儲執行該操作所需的所有信息,即 。是不是通過直接調用其 的GetEnumerator方法或者通過的foreach

所以,直到你實際上是通過它枚舉,但實際上其不會」執行該方法 代表的詢問,直到對象列舉要麼t處理列表。一個簡單的測試將低於

 List<int> intlist = new List<int>() {1,2,3}; 

     var result = intlist.Select(x => x); 

     intlist.Add(12); 

     foreach (var item in result) 
     { 
      Console.WriteLine(item); 
     } 

這將考慮即使是發生在被LINQ表達後添加的元素。本來它已經急於加載它將不包括元素12

結果:

1 
2 
3 
12 

更新:對於這兩種延遲執行並已執行的,一個完整的示例來看看this .NET fiddle example

+0

那麼代碼的實際輸出是什麼? – Enigmativity

+1

@Enigmativity,請參閱編輯答案。 – Rahul

+1

'.Select()'不......但是.Any()'調用將至少使用一個。 –