object[] vs List<object> vs IEnumerable<object>

本文关键字:object lt vs gt IEnumerable List | 更新日期: 2023-09-27 17:52:46

我有大量相同类别obj的对象,当前定义为obj[]

在大多数情况下,这些obj只是default(obj),不是最好实现IEnumerable<obj>而不是这些obj[]列表吗?

这应该为我释放内存,对吗?目前这些对象(运行内存分析器)有200k项(不断增长)。

将列表更改为IEnumerables会帮助我吗?

object[] vs List<object> vs IEnumerable<object>

List<T>的实际实现是基于数组的,因此两者之间的内存使用差异可以忽略不计。

IEnumerable<T>而言:不,它不会为您节省任何内存。nulldefault元素在IEnumerable<T>中是完全可以接受的,框架不做任何事情来过滤重复项。它不能,因为与IEnumerable<T>结构相关的内存占用完全依赖于实现它的类,如果您只是将数组放入可枚举变量或字段,那么您不会改变任何实质性的东西。Enumerables也是不可变的,所以建议的切换可能会对你的数组实现造成破坏性的改变。

如果你不关心排序,你可以使用HashSet<T>。这个实际上会过滤重复项,所以如果您的许多或大多数元素都是default(T),那么您只需要其中一个元素的内存。显然,这将消除所有重复的,而不仅仅是默认的,所以这个选择只有在没有其他重复的情况下才有用。

如果你需要可变语义——我怀疑如果你正在使用数组的话——那么你可以 (应该)切换到一个可变接口,比如IList<T>,并编写你自己的实现——可能基于List<T>——当你试图添加default(T)时,它会忽略它。这样就可以保留非default元素的顺序,而不必分配任何内存来保存default元素。

如果您确实需要保留所有的原始元素,那么没有简单的数据结构可以帮助您。我可以建议使用数据库吗?我知道现在内存很充裕,但是当你要存储成千上万的数据项时,你至少应该考虑为这种规模设计的数据结构或系统。

IEnumerable只是一个接口;它没有规定任何存储数据的方法。List只包含一个数组,当您向其中添加更多项时该数组会增长,但是您可以调用TrimExcess()方法来缩小数组。

正如Mark所说,IEnumerable只是一个接口。Object[]和List(以及。net框架中大多数其他泛型集合)实际上实现了IEnumerable接口。

更合适的问题应该是Object[]、List或LinkedList等哪个更好。

对象数组(即Object[])将具有最小的内存占用,因为列表可能是数组内存大小的两倍(取决于列表中有多少元素)。

当您向List中添加一个项目并且内部数组已满时,从算法的角度来看,它会将数组的大小增加一倍,以使添加新元素的速度平均更快。