为什么要创建一个IEnumerable?

时间:2010-12-19 02:01:39

标签: c#

我不明白为什么我要创建一个IEnumerable。或者为什么它很重要。

我正在查看IEnumerable的示例: http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx

但如果我刚刚去的话,我基本上可以做同样的事情:

 List<Person> people = new List<Person>();

那么IEnumerable有什么用呢?你能给我一个我需要创建一个实现IEnumerable的类的情况吗?

11 个答案:

答案 0 :(得分:14)

IEnumerable是一个接口,它将某些内容暴露给外部。虽然你完全正确,但你可以使用List<T>,但List<T>在继承树中非常深。 List<T>究竟是什么?它存储项目,它为AddRemove提供了某些方法。现在,如果您只需要List<T>的“项目保持”功能,该怎么办?这就是IEnumerable<T> - 一种抽象的方式说“我想得到一个我可以迭代的项目列表”。列表是“我想获得一个我可以修改的集合,可以通过索引和迭代访问”。 List<T>提供了比IEnumerable<T>更多的功能,但它占用了更多内存。因此,如果方法采用IEnumerable<T>,则只要对象提供IEnumerable<T>的可能性,它就不关心它究竟是什么。

此外,您不必创建自己的IEnumerable<T>List<T> IS IEnumerable<T>

答案 1 :(得分:5)

列表当然是IEnumerable - 作为一般规则,您希望具体说明您输出的内容,但广泛接受您作为输入的内容,例如:

你有一个子循环遍历一个对象列表并将一些内容写入控制台......

您可以将参数声明为IEnumerable<T>IList<T>(甚至是List<T>)。由于您不需要添加到输入列表,实际需要做的就是枚举 - 所以使用IEnumerable - 那么您的方法也将接受实现IEnumerable的其他类型,包括IQueryable,链接列表等等......

您可以免费使用您的方法。

答案 2 :(得分:2)

今天,除非您在旧版本的框架上支持软件,否则通常不会再使用IEnumerable。今天,您通常使用IEnumerable<T>。除了其他好处之外,IEnumerable还完全实现了所有LINQ操作/扩展,以便您可以使用LINQ轻松查询实现IEnumerable<T>的任何List类型。

此外,它不会将代码的使用者与特定的集合实现联系起来。

答案 3 :(得分:2)

现在你需要创建自己的容器类是很少见的,因为你在那里存在许多好的实现。

但是,如果由于某些特定原因而创建自己的容器类,则可能希望实现IEnumerable或IEnumerable<T>,因为它们是用于itteration的标准“契约”,并且通过提供实现,您可以利用方法想要IEnumerable或IEnumerable<T> Linq的/ apis会给你一些有用的免费扩展方法。

答案 4 :(得分:1)

IList可以被视为IEnumerable的特定实现。 (可以轻松添加和删除的一个。)还有其他一些,例如IDictionary,它执行完全不同的功能,但仍然可以枚举。一般来说,当我只需要一个枚举来满足一个要求并且不特别关心它是什么类型时,我会使用IEnumerable作为更通用的类型引用。我可以传递IList,而不是我经常这样做,但是灵活性也可以传递给其他枚举。

答案 5 :(得分:1)

以下是我认为必须实现IEnumerable而不使用List&lt;&gt;

的一种情况

我想从远程服务器获取所有项目。假设我有一百万件物品要归还。如果您使用List&lt;&gt;方法,您需要首先缓存内存中的所有一百万个项目。在某些情况下,你真的不想这样做,因为你不想耗尽太多的内存。使用IEnumerable可以让您在屏幕上显示数据,然后立即处理它。因此,使用IEnumerable方法,程序的内存占用量要小得多。

答案 6 :(得分:0)

我的理解是IEnumerable是作为创建自己的可枚举类类型的接口提供给你的。

我相信一个简单的例子就是重新创建List类型,如果你想拥有自己的一套功能(或缺少功能)。

答案 7 :(得分:0)

如果要枚举可能具有无限大小的集合(例如Fibonacci数字),该怎么办?您无法使用列表轻松完成此操作,但如果您有一个实现IEnumerableIEnumerable<T>的类,则会变得很容易。

答案 8 :(得分:0)

当内置容器满足您的需求时,您绝对应该使用它,而且IEnumerable免费提供。无论出于何种原因,您必须实现自己的容器,例如,如果它必须由数据库支持,那么您应该确保实现IEnumerableIEnumerable<T>,原因有两个:

  1. 它使foreach工作,这很棒
  2. 它几乎可以实现所有LINQ的优点。例如,您将能够将容器过滤到与具有优雅单线条的条件匹配的对象。

答案 9 :(得分:0)

IEnumerable为您的API用户(包括您自己)提供了通过foreach方式使用您的集合的方法。例如,我在我的Binary Tree类中实现了IENumerable,所以我可以只需要在树中的所有项目上进行操作,而无需按Ctrl + C Ctrl + V遍历树InOrder所需的所有逻辑。

希望有所帮助:)

答案 10 :(得分:0)

如果你有一个集合或方法可以返回一堆东西,但不是一个字典,列表,数组或其他这样的预定义集合,IEnumerable很有用。当一个人开始输出时,要返回的东西可能不可用的情况下,它尤其有用。例如,访问数据库中记录的对象可能实现iEnumerable。虽然这样的对象可能会将所有适当的记录读入数组并返回该数据,但如果有大量记录则这可能是不切实际的。相反,该对象可以返回一个枚举器,该枚举器可以读取小组中的记录并单独返回它们。