2012-03-01 83 views
3

如果您正在使用集合List<T>或甚至在类中的arraylist,为什么要创建自己的枚举类,只需实现IEnumerable并返回枚举数。我在网上看到的例子,人们创建自己的enumerable类,并实现当前,下移等...何时创建您自己的IEnumerable类

+0

您在网上找到的示例可能是在C#支持的迭代器块之前编写的。 – phoog 2012-03-01 18:03:06

回答

7

那么,如果你有一个集合类,你可能不会只是包装一些其他集合是Enumerable,应该。

也就是说,我总是更喜欢使用yield关键字,即使手动定义一个枚举。接下来定义电流/移动的大多数例子根本不知道产量或如何使用它。 (由于确切原因,我曾经实现了一个定义Current/Enumerable类的下一个类。)

另一种情况可能是基础集合是旧的并且不实现IEnumerable<T>而只是IEnumerable。如果你的集合是强类型的,你不仅需要返回它们的枚举器(至少它将是一个.Cast<T>()调用)。

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

0

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

3

比方说,你想遍历一个文件的行,你不想把它们全部加载到内存中。您可以返回一个IEnumerable<string>,它将按需读取下一行,而不是将所有内容加载到内存中。我还喜欢使用yield来处理这种类似于@Servy提到的情况。