![](/img/trans.png)
[英]Do I REALLY need to implement IEnumerable? What is System.Collections.IEnumerator?
[英]Why do we need IEnumerator and IEnumerable?
好的,我只是在處理IEnumerator
和IEnumerable
。 現在MSDN說這些東西的主要目標是遍歷客戶集合。
很公平但我能夠在不使用任何一個的情況下迭代自定義集合(或者至少我想這么認為)
namespace ienumerator
{
class person
{
public person(string first, string second)
{
fname = first;
lname = second;
}
public string fname { get; set; }
public string lname { get; set; }
}
class person_list
{
public person[] list;
public person_list(person[] per)
{
list = new person[per.Length];
for (int i = 0; i < per.Length; i++)
{
list[i] = per[i];
}
}
}
class Program
{
static void Main(string[] args)
{
person[] names = new person[3]
{
new person("some","one"),
new person("another","one"),
new person("sss","ssdad"),
};
person_list list_of_names = new person_list(names);
int i = 0;
while (i < list_of_names.list.Length)
{
Console.WriteLine(list_of_names.list[i].fname);
i++;
}
Console.Read();
}
}
}
那么在我的理解中有什么缺陷,上面給出了我在實現IEnumerator
和IEnumerable
后獲得的相同結果。
然而,我可以在不使用任何一個的情況下迭代自定義集合
當然, 您可以在沒有界面的情況下迭代自己的集合; 如果你不能,那你將如何實現界面?
作為代碼實現者, 您不會為了方便而實現接口。 您為了方便代碼的使用者而實現它。 界面意味着“關注客戶:您可以枚舉此集合的內容,而無需了解我如何實現它”。
這就是界面的目的:它提供了一種抽象,允許代碼的消費者使用它而無需了解它的工作原理。
在您的main
函數中,您使用了person_list
兩個方面來遍歷人員列表, Length
和[]
運算符,用於將集合的成員person_list
某個位置。
但是,如果您有一些容器或自定義集合未實現其中一個或兩個,該怎么辦? 例如,逐行讀取文件的類可能事先不知道集合的長度是多少,因此不定義Length
。 從隊列中讀取消息的枚舉器可能只能接受下一個,而不是一個,比如前面的四個位置[4]
。 在這兩種情況下,您仍然可以正確地“迭代”整個集合。
IEnumerator
和IEnumerable
完全需要foreach
工作所需的屬性而不需要其他屬性,這就是為什么函數可以將它們用作需求,因為它們知道它們能夠遍歷它們傳遞的任何類型的集合。
您當然可以迭代自定義集合而無需實現IEnumerable
接口,但迭代代碼必須知道您的自定義集合。
如果實現IEnumerable
,則迭代所有元素的代碼不需要知道您的person_list
類。 它使用一個實現IEnumerable
類的實例,如果你將實際的實例交換為后來也實現IEnumerable
其他東西,它仍然可以工作。
實際上,在C#中,不需要實現IEnumerable
和IEnumerator
來自定義您自己的集合。 如果您使用適合您的傳統方式迭代集合,但如果您使用foreach
迭代集合則會遇到麻煩。
另一個原因,如果你想暴露你的類以便VB.NET用戶可以使用你應該考慮實現這兩個接口。
請注意, IEnumerable
在非泛型和泛型集合中是不同的。 非泛型屬於System.Collection
,另一個屬於System.Collection.Generic
命名空間
有很多方法可以迭代自定義序列。 一種方法是使用迭代器設計模式 。
Iterator模式用於統一遍歷自定義序列(它可以是內存中的集合,生成集合或其他內容)。 在.NET世界中,這種模式以下列方式實現:我們有一個可迭代的對象,它實現了IEnumerable
接口(這向你的班級的任何客戶展示了你有能力遍歷你的內容)。
我們有一個迭代器本身(實現IEnumerator
接口的對象),您可以將其視為可迭代對象中當前位置的“指針”。 因為您可能有內部循環(即一次在同一個對象上進行多次迭代),您必須從迭代器中拆分可迭代對象。
基本上有很多方法可以遍歷特定的序列,但是迭代器模式使您能夠“概括”這種方法,從實現中的調用者隱藏遍歷算法的特定實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.