为什么我们需要IEnumerator和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
在非generics和generics集合中是不同的。 非generics属于System.Collection
,另一个属于System.Collection.Generic
命名空间
有很多方法可以迭代自定义序列。 一种方法是使用迭代器设计模式 。
迭代器模式用于统一遍历自定义序列(它可以是内存中的集合,生成集合或其他内容)。 在.NET世界中,这种模式以下列方式实现:我们有一个可迭代的对象,它实现了IEnumerable
接口(这向你的class级的任何客户展示了你有能力遍历你的内容)。
我们有一个迭代器本身(实现IEnumerator
接口的对象),您可以将其视为可迭代对象中当前位置的“指针”。 因为您可能有内部循环(即一次在同一个对象上进行多次迭代),您必须从迭代器中拆分可迭代对象。
基本上有很多方法可以遍历特定的序列,但是Iterator Pattern使您能够“概括”这种方法,从实现中的调用者隐藏遍历算法的特定实现。
上述就是C#学习教程:为什么我们需要IEnumerator和IEnumerable?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/962282.html