C# 为什么要创建IEnumerable?

C# 为什么要创建IEnumerable?,c#,C#,我不明白为什么我要创建一个IEnumerable。或者为什么它很重要 我正在看IEnumerable的示例: 但是如果我去的话,我基本上可以做同样的事情: List<Person> people = new List<Person>(); List people=newlist(); 那么IEnumerable有什么好处呢?你能给我一个我需要创建一个实现IEnumerable的类的情况吗?据我所知,IEnumerable是作为创建你自己的可枚举类类型的接口提供给你

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

我正在看IEnumerable的示例:

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

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

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

据我所知,IEnumerable是作为创建你自己的可枚举类类型的接口提供给你的


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

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

您有一个子循环通过对象列表,并将某些内容写入控制台

您可以将参数声明为
IEnumerable
IList
(甚至
List
)。因为您不需要添加到输入列表中,所以实际上只需要枚举-所以使用
IEnumerable
-然后您的方法还将接受实现IEnumerable的其他类型,包括
IQueryable
、链接列表等


您正在免费使您的方法更通用。

IEnumerable
是一个接口,它向外部公开某些内容。虽然您完全正确,但是您可以使用
列表
,但是
列表
在继承树中非常深入。
列出的具体内容是什么?它存储项目,提供某些方法来添加和删除项目。现在,如果您只需要
列表的“项目保留”功能怎么办?这就是
IEnumerable
是一种抽象的表达方式,意思是“我想得到一个可以迭代的项目列表”。列表是“我想得到一个可以修改、可以通过索引访问和迭代的集合”<代码>列表提供了比IEnumerable多得多的功能,但占用了更多的内存。因此,如果一个方法接受一个
IEnumerable
,它并不关心它到底得到了什么,只要对象提供了
IEnumerable
的可能性


此外,您不必创建自己的
IEnumerable
,一个
列表就是一个
IEnumerable

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

如果要枚举一个可能具有无限大小的集合,例如斐波那契数,该怎么办?使用列表无法轻松做到这一点,但如果您有一个实现了
IEnumerable
IEnumerable
的类,它就变得很容易了。

当内置容器满足您的需要时,您一定要使用它,而且IEnumerable是免费的。无论出于何种原因,您必须实现自己的容器,例如,如果它必须由DB支持,那么您应该确保同时实现
IEnumerable
IEnumerable
,原因有两个:

  • 它使foreach工作,这是可怕的
  • 它使几乎所有的LINQ善良。例如,您将能够使用一个优雅的单行线将容器过滤到与条件匹配的对象

  • IEnumerable为API用户(包括您自己)提供了通过foreach使用集合的方法。例如,我在我的二叉树类中实现了IENumerable,这样我就可以对树中的所有项进行foreach,而不必按Ctrl+C Ctrl+V的顺序遍历树所需的所有逻辑


    希望它有帮助:)

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

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


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

    这里有一种情况,我认为我必须实现IEnumerable,但不使用List

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

    很少使用nowda