List 和 IEnumerable 之间的实际区别 [重复]

Posted

技术标签:

【中文标题】List 和 IEnumerable 之间的实际区别 [重复]【英文标题】:Practical difference between List and IEnumerable [duplicate] 【发布时间】:2013-07-03 13:04:23 【问题描述】:

通过阅读类似的帖子,我了解到 List 是一种 IEnumerable。但我真的很想知道这两者之间的实际区别是什么。

致一直使用 List 而从未使用过 IEnumerable 的人:

两者之间的实际区别是什么? 在什么情况下,其中一种比另一种更好?

这是一个实际示例: 我们想要存储四个字符串,按字母顺序排列,将它们传递给另一个函数,然后向用户显示结果。我们将使用什么以及为什么?

希望有人可以为我解决这个问题或为我指明正确的方向。 提前致谢!

【问题讨论】:

A List 不是IEnumerable 的类型,它履行了IEnumerable 规定的合同(即它可以用作IEnumerable)。如果你想存储字符串,你会使用一个列表。您不能使用可枚举,因为它不是一个类。如果需要,您可以将列表作为可枚举访问。 这不应被标记为重复的问题。另一个问题是关于使用 LINQ 时的 IEnumberable 与 List。这个问题与 LINQ 无关。 List 允许随机访问,但 IEnumerable 不允许 【参考方案1】:

IEnumerable 和 List 之间的一个重要区别(除了一个是接口,另一个是具体类之外)是 IEnumerable 是只读的,而 List 不是。

因此,如果您需要对您的收藏进行任何类型的永久更改(添加和删除),您将需要 List。如果您只需要读取、排序和/或过滤您的集合,IEnumerable 就足够了。

因此,在您的实际示例中,如果您想一次添加四个字符串,则需要 List。但是,如果您要一次全部实例化您的集合,则可以使用 IEnumerable。

IEnumerable firstFourLettersOfAlphabet = new[]"a","b","c","d";

然后,您可以使用 LINQ 对列表进行过滤或排序。

【讨论】:

您可以使用 IEnumerable 执行其他一些很酷的事情,而您无法使用 List 执行此操作。查看 yield 关键字。 kenneth-truyers.net/2016/05/12/yield-return-in-c【参考方案2】:

List<T> 以外的许多类型都实现了IEnumerable,例如ArrayList。所以一个优点是你可以将不同的集合类型传递给同一个函数。

【讨论】:

以上是关于List 和 IEnumerable 之间的实际区别 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

由于 .net-core 中的 linq-statement 导致 IEnumerable 和 List 之间出现意外差异? [复制]

IEnumerable和List有啥区别

我的 Entity Framework 存储库和服务层方法应返回哪些类型:List、IEnumerable、IQueryable?

C# FindAll VS Where 速度

为啥我不能将 List<List<Foo>> 传递给 IEnumerable<IEnumerable<Foo>>

如何在 Asp.NET MVC 视图名称空间中使用 List 或 IList 代替 IEnumerable?