List和IEnumerable之间的实际区别

86
通过阅读类似的帖子,我了解到 List 是 IEnumerable 类型的一种。但我真正想知道这两者之间的实际差异是什么。
对于一直使用 List 而从未使用过 IEnumerable 的人来说:
- 两者之间的实际区别是什么? - 在哪些情况下其中一个比另一个更好?
以下是一个实际示例: 我们想要存储四个字符串,按字母顺序排序,将它们传递给另一个函数,然后向用户显示结果。我们应该使用什么,为什么?
希望有人能为我澄清这个问题或指导我正确的方向。提前感谢!

2
一个 List 不是 IEnumerable 的一种类型,它只是满足了 IEnumerable 所规定的契约(即可以被用作 IEnumerable)。如果你想存储字符串,你会使用一个列表。你不能使用可枚举的对象,因为它不是一个类。但是如果你想的话,你可以将列表作为可枚举对象来访问。 - George Duckett
13
不应将此问题标记为重复问题。另一个问题讨论了在使用LINQ时IEnumberable与List的区别,而这个问题并不涉及LINQ。 - iheartcsharp
列表允许随机访问,但IEnumerable不允许。 - Binoy Kumar
2个回答

242

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

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

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

IEnumerable firstFourLettersOfAlphabet = new[]{"a","b","c","d"};
你可以使用LINQ对列表进行筛选或排序,以你想要的方式进行。

3
有些其他酷炫的操作使用IEnumerable是做不到的,而List却能。看看yield关键字吧。https://www.kenneth-truyers.net/2016/05/12/yield-return-in-c/ - Kevin

16

除了 List<T> 之外,许多其他类型也实现了 IEnumerable,例如一个 ArrayList。因此,一个优点是您可以将不同的集合类型传递给同一个函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接