2014-12-19 42 views
3

在Internet上搜索什麼是C#中的IEnumerable接口?它解決的問題?如果我們不使用它會怎麼樣?但從來沒有得到太多。大量的帖子解釋瞭如何實現它。c#中的IEnumerable接口是什麼?如果我們不使用它會怎樣?

我也發現下面的例子

List<string> List = new List<string>(); 
     List.Add("Sourav"); 
     List.Add("Ram"); 
     List.Add("Sachin"); 


     IEnumerable names = from n in List where (n.StartsWith("S")) select n; 
     // var names = from n in List where (n.StartsWith("S")) select n; 

     foreach (string name in names) 
     { 
      Console.WriteLine(name); 
     } 

上述前輸出:

Sourav

薩欽

我想知道,在優勢在上面的例子中使用IEnumerable?我可以使用'var'(註釋行)來實現相同的功能。

如果你們中的任何一位能幫助我理解這一點,並且以示例方式使用IEnumerable有什麼好處,我將不勝感激。如果我們不使用它呢?

+0

'IEnumerable的名字= ...'意味着你不感興趣的確切類型序列中的項目。任何事情都會很好。所以,你可以編寫'foreach(int name in names)',它會編譯(但肯定會在運行時失敗)。您可以顯式聲明類型:'IEnumerable names = ...'或者您可以讓編譯器爲您推斷它:var names = ...' – Sinix 2014-12-19 14:09:01

回答

6

除了閱讀documentation我會形容IEnumerable<T>爲Ts的集合,可以遍歷等諸多功能,可以進行(例如在(),任何()和COUNT()),但是它不是爲添加和刪除元素而設計的。這是一個List<T>

這很有用,因爲它是許多集合的基本接口,各種數據訪問層和ORM都使用它,並且許多擴展方法都會自動包含它。

List,Arrays,Bags,Queues,Stacks的許多具體實現都實現了它,允許各種各樣的集合使用它的擴展方法。

也可以在foreach循環中使用實現IEnumerable或IEnumerable的集合。

msdn

用於在陣列中的每個元件或實現 的System.Collections.IEnumerable或 System.Collections.Generic.IEnumerable接口的對象集合。

在你的代碼示例,你已經有了一個變量叫名字,這將是一個IEnumerable<string>,是要明白,這將是一個IEnumerable<string>不管你是否使用var關鍵字與否是非常重要的。 var只允許您避免每次都明確寫入類型。

TLDR

這對許多不同類型的讓你用你的收藏中foreach循環,並提供了很多額外的擴展方法免費收藏的一個共同的基礎界面。

+0

「這也是允許您的集合可用於一個foreach循環「沒有它的唯一方法。 – Aron 2014-12-19 08:12:00

+0

使用IEnumerable有什麼好處?只需搜索在OOP中使用接口的好處。 – jlvaquero 2014-12-19 08:13:31

+0

@Aron我確定有另一個......也許我在想通用/非通用版本。我已經變成了「最常見」,直到我能夠支持它! – Liath 2014-12-19 08:14:11

0

MSDN

「的缺點省略IEnumerable和IEnumerator的是集合類不再用的foreach語句,或等效的語句,其他公共語言運行庫語言的互操作。」

因此,您需要實現此接口,以便您的自定義集合類型可以與其他CLR語言一起使用。這似乎是一個CLS要求。

1

IEnumerable以及更優選的IEnumerable<T>是處理「元素序列」模式的標準方法。

這個想法是每種類型: IEnumerable<T>看起來像是有一個標籤:「枚舉我」。無論如何:訂單項的隊列,控件的集合,來自sql查詢的記錄,xml元素子節點等等等等 - 從enumerable的角度來看,它們都是一樣的:你有一個序列,你可以爲每個來自序列的項目。

請注意IEnumerable是有限的:沒有計數,沒有索引訪問,沒有保證可重複結果,沒有辦法檢查如果枚舉是空的,但得到枚舉器,並檢查是否有任何東西。簡單性允許涵蓋幾乎所有用例,從集合到特設序列(自定義迭代器,linq查詢等)。

有人問多次,我這裏還有一些答案:123

相關問題