List 和 IEnumerable 之间的实际区别 [重复]
Posted
技术标签:
【中文标题】List 和 IEnumerable 之间的实际区别 [重复]【英文标题】:Practical difference between List and IEnumerable [duplicate] 【发布时间】:2013-07-03 13:04:23 【问题描述】:通过阅读类似的帖子,我了解到 List 是一种 IEnumerable。但我真的很想知道这两者之间的实际区别是什么。
致一直使用 List 而从未使用过 IEnumerable 的人:
两者之间的实际区别是什么? 在什么情况下,其中一种比另一种更好?这是一个实际示例: 我们想要存储四个字符串,按字母顺序排列,将它们传递给另一个函数,然后向用户显示结果。我们将使用什么以及为什么?
希望有人可以为我解决这个问题或为我指明正确的方向。 提前致谢!
【问题讨论】:
AList
不是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 之间出现意外差异? [复制]
我的 Entity Framework 存储库和服务层方法应返回哪些类型:List、IEnumerable、IQueryable?