Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 何时创建自己的IEnumerable类_C#_.net_Ienumerable - Fatal编程技术网

C# 何时创建自己的IEnumerable类

C# 何时创建自己的IEnumerable类,c#,.net,ienumerable,C#,.net,Ienumerable,如果您在类中使用集合列表甚至arraylist,那么当您可以实现IEnumerable并返回枚举器时,为什么要创建自己的枚举类呢。我在网上看到一些例子,人们创建自己的可枚举类并实现current、movenext等。好吧,如果你有一个collection类,你可能不仅仅是包装一些其他可枚举的集合,而且会返回你应该返回的内容 也就是说,我总是喜欢使用yield关键字,即使是手动定义可枚举项。大多数定义当前/下一步行动的人都不知道收益率或如何使用收益率。(我曾经实现过一个可枚举类,用于定义当前/下一

如果您在类中使用集合
列表
甚至arraylist,那么当您可以实现IEnumerable并返回枚举器时,为什么要创建自己的枚举类呢。我在网上看到一些例子,人们创建自己的可枚举类并实现current、movenext等。

好吧,如果你有一个collection类,你可能不仅仅是包装一些其他可枚举的集合,而且会返回你应该返回的内容

也就是说,我总是喜欢使用yield关键字,即使是手动定义可枚举项。大多数定义当前/下一步行动的人都不知道收益率或如何使用收益率。(我曾经实现过一个可枚举类,用于定义当前/下一步移动,正是出于这个原因。)

另一种情况可能是基础集合很旧,没有实现
IEnumerable
,而只是实现
IEnumerable
。如果您的集合是强类型的,那么您需要做的不仅仅是返回它们的枚举数(至少是
.Cast()
调用)


如果您确实有一个基础集合,那么它也可能是您不想公开的某个私有嵌套类(可能是某种自定义键值对)的集合。在这种情况下,您可能需要返回.Select调用,而不仅仅是传递现有的枚举数(但很可能不需要实际实现自己的迭代器)。

这些示例可能是预泛型吗?我可以看出,如果您不使用泛型,那么您将被迫实现IEnumerable并实现它的方法。

假设您希望迭代文件的行,而不希望将它们全部加载到内存中。您可以返回一个
IEnumerable
,它将根据需要读取下一行,而不是将所有内容加载到内存中。我也更喜欢使用
yield
来处理这种情况,就像前面提到的@Servy一样。

您在网上找到的示例可能是在C#支持的迭代器块之前编写的。