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