C# 对象[]与列表<;对象>;vs IEnumerable<;对象>;

C# 对象[]与列表<;对象>;vs IEnumerable<;对象>;,c#,list,memory-management,C#,List,Memory Management,我有很多同一类的对象obj,当前定义为obj[] 在大多数情况下,这些obj只是default(obj),不是最好实现IEnumerable而不是这些obj[]列表吗 这应该可以释放我的记忆,对吗? 目前,这些对象(运行内存分析器)有20万个项目(不断增长) 将列表更改为IEnumerable对我有帮助吗?IEnumerable只是一个接口;它没有规定任何存储数据的方法。列表只包含一个数组,该数组随着您向其中添加更多项而增长,但您可以调用该方法来缩小该数组。列表的实际实现基于数组,因此两者之间的

我有很多同一类的对象
obj
,当前定义为
obj[]

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

这应该可以释放我的记忆,对吗? 目前,这些对象(运行内存分析器)有20万个项目(不断增长)


将列表更改为IEnumerable对我有帮助吗?

IEnumerable
只是一个接口;它没有规定任何存储数据的方法。
列表
只包含一个数组,该数组随着您向其中添加更多项而增长,但您可以调用该方法来缩小该数组。

列表的实际实现基于数组,因此两者之间的内存使用差异可以忽略不计

IEnumerable
而言:不,它不会为您节省任何内存
null
default
元素在
IEnumerable
中是完全可以接受的,并且框架不做任何事情来过滤重复项。它不能,因为与
IEnumerable
结构相关的内存占用完全依赖于实现它的类,如果只将数组放入可枚举变量或字段中,那么您就不会更改任何实质性的内容。可枚举项也是不可变的,因此建议的切换可能是对您的阵列实现的突破性更改

如果你不在乎订购,你可以使用。这实际上会过滤重复项,因此如果您的许多或大部分元素都是
default(T)
,那么您只需要为其中一个元素提供内存。显然,这将消除所有重复项,而不仅仅是默认的重复项,因此只有在没有其他重复项的情况下,此选项才有用

如果您需要可变语义(我怀疑您在使用数组时会这样做),那么您可以(也应该)切换到可变接口,例如
IList
,并编写自己的实现-可能基于
List
,当您尝试添加它时,它会忽略
default(T)
。这样,您就可以保留非
default
元素的顺序,而无需分配任何内存来保存
default
元素


如果您确实需要保留所有原始元素,那么没有简单的数据结构可以帮助您。我可以推荐一个数据库吗?我知道现在的内存很丰富,但当你存储数十万个项目时,你至少应该考虑一个为这种规模设计的数据结构或系统。

正如马克所说,IEnumerable只是一个接口。对象[]和列表(以及.NET framework中的大多数其他通用集合)实际上实现了IEnumerable接口

更合适的问题是Object[]或List或LinkedList等是否更好

对象数组(即Object[])的内存占用最小,因为该列表可能是数组内存大小的两倍(取决于列表中的元素数量)。当您向列表中添加一项且内部数组已满时,它会将数组的大小增加一倍,以尝试从算法角度平均更快地添加新元素