2016-10-18 25 views
2

我有一個基本的疑問,但我無法弄清楚我自己。 我有一段代碼如下:用列表替換IEnumerable

List<string> List = new List<string>(); 
      List.Add("A"); 
      List.Add("B"); 
      List.Add("sam); 
      List.Add("Sed"); 

IEnumerable<string> names = from n in List where (n.StartsWith("S")) select n; 

爲什麼上面的代碼請求一個顯式轉換如果IEnumerable的被替換的具體實施,即,列表。

即如果我使用:

List<string> names = from n in List where (n.StartsWith("S")) select n; 

具有編譯錯誤。

我可以盲目使用Ienumerable,但我想知道當我使用List時發生了什麼?

回答

4

List<T> implements IEnumerable<T>。這意味着每列表是一個枚舉。但這種關係不適用。 IEnumerable<T>不是實施IList<T>。有許多枚舉不是列表; Stack<T>HashSet<T>,數組,Dictionary<T, K>,迭代塊等

因此,您必須使用ToList()擴展方法明確創建從枚舉列表:

List<string> names = (from n in List where (n.StartsWith("S")) select n).ToList(); 
+0

只是有一個問題,當我做對列表的操作名單=新名單();(在這種情況下,名稱檢查) ,並LINQ的操作輸出將在IEnumerable的始終?輸入是List user2630764

+3

@ user2630764 ling擴展方法將返回一個「IEnumerable 」,與您所查詢的任何「IEnumerable 」無關;它可以是一個列表,一個數組,一個枚舉等,它不會有問題。此外,重要的是你知道linq是* lazy *。這意味着只有在實際枚舉它時(例如使用'foreach'語句或'ToList()'),查詢的答案纔會被枚舉。 – InBetween

3

IEnumerable<T>List<T>沒有隱含的轉換,因爲IEnumerable根本就不是List

如果你要轉換的枚舉到列表中,使用.ToList<T>()

List<string> names = (from n in List where (n.StartsWith("S")) select n).ToList(); 

其實,你的收藏甚至不一一列舉,直到你打電話.ToList()

0

List是的IEnumerable,IEnumerable不能列出

理論上,在linq的情況下,你的表達是一個表達式,而不是一個集合。集合通常具有有限數量的元素,而表達式只是通過指定規則從某些集合中選擇元素的函數。

通過寫

var expression = from n in orig_collection select n; 

你定義將上的orig_collection

枚舉施加描述規則的表達式(IEnumerable的)通過寫

var collection = expression.ToList(); 

你通過orig_collection枚舉到端在表達過程中應用。這將導致一個新的列表