当前位置:  开发笔记 > 编程语言 > 正文

数组与List <T>:何时使用哪个?

如何解决《数组与List<T>:何时使用哪个?》经验,为你挑选了5个好方法。

实际上,您很少想要使用数组.绝对可以List随时使用添加/删除数据,因为调整数组大小非常昂贵.如果您知道数据是固定长度的,并且您希望根据某些非常具体的原因进行微优化(在基准测试之后),那么数组可能会很有用.

List提供了很多更多的功能不是一个数组(虽然LINQ找齐它一点),而且几乎总是正确的选择.params当然,除了争论.;-p

作为反击 - List是一维的; 在哪里 - 因为你有矩形(等)数组,int[,]或者string[,,]- 但是在对象模型中还有其他方法可以建模这些数据(如果需要).

也可以看看:

如何/何时放弃在c#.net中使用数组?

数组,有什么意义?

也就是说,我在protobuf-net项目中大量使用了数组; 完全是为了表现:

它会进行大量的位移,所以a byte[]对编码非常重要;

我使用一个本地滚动byte[]缓冲区,在发送到底层流(和vv)之前我填充; 比BufferedStream等更快;

它在内部使用基于数组的对象模型(Foo[]而不是List),因为大小一旦构建就固定,并且需要非常快.

但这绝对是个例外; 对于一般的业务线处理,List每次都获胜.



1> Marc Gravell..:

实际上,您很少想要使用数组.绝对可以List随时使用添加/删除数据,因为调整数组大小非常昂贵.如果您知道数据是固定长度的,并且您希望根据某些非常具体的原因进行微优化(在基准测试之后),那么数组可能会很有用.

List提供了很多更多的功能不是一个数组(虽然LINQ找齐它一点),而且几乎总是正确的选择.params当然,除了争论.;-p

作为反击 - List是一维的; 在哪里 - 因为你有矩形(等)数组,int[,]或者string[,,]- 但是在对象模型中还有其他方法可以建模这些数据(如果需要).

也可以看看:

如何/何时放弃在c#.net中使用数组?

数组,有什么意义?

也就是说,我在protobuf-net项目中大量使用了数组; 完全是为了表现:

它会进行大量的位移,所以a byte[]对编码非常重要;

我使用一个本地滚动byte[]缓冲区,在发送到底层流(和vv)之前我填充; 比BufferedStream等更快;

它在内部使用基于数组的对象模型(Foo[]而不是List),因为大小一旦构建就固定,并且需要非常快.

但这绝对是个例外; 对于一般的业务线处理,List每次都获胜.


更多功能==更复杂==不好,除非你需要这些功能.这个答案基本上列出了为什么数组更好的原因,但得出了相反的结论.
@EamonNerbonne如果你不使用这些功能,我几乎可以保证它们不会伤害你......但是:根据我的经验,从不需要变异的集合数量要小得多****比那些变异的
关于调整大小的论点是完全有效的.然而,即使不需要调整大小,人们也更喜欢列表.对于后一种情况,是否存在一个可靠的逻辑论证,或者它只不过是"数组不合时宜"?
@MarcGravell:这取决于你的编码风格.根据我的经验,几乎没有任何收藏品发生变异.那是; 从数据库中检索集合或从某些源构建集合,但总是通过重新创建新集合(例如,映射/过滤器等)来完成进一步处理.即使在需要概念变异的地方,最简单的方法就是生成新的集合.我只是将集合变异为性能优化,并且这种优化往往是高度本地化的,并且不会将变异暴露给API使用者.
"当你想要添加/删除数据时,绝对可以使用List ,因为调整数组的大小非常昂贵." List 在内部使用数组.你在想LinkedList 吗?
@Dangph:List 使数组保持大于它需要的大小,因此并非每个添加/删除操作都需要调整数组大小,因为大多数时候数组末尾仍然有空闲空间.

2> Jon Skeet..:

真的只是回答添加一个我很惊讶的链接尚未被提及:Eric的Lippert的博客文章"Arrays被认为有些危害".

您可以从标题中判断它建议在任何实际情况下使用集合 - 但正如Marc正确指出的那样,有很多地方阵列确实是唯一实用的解决方案.


哈哈,终于在3年后阅读了这篇文章.那么好文章,好文章吧.:)

3> Alnitak..:

尽管推荐了其他答案List,但您还是希望在处理时使用数组:

图像位图数据

其他低级数据结构(即网络协议)


@Konrad - 好吧,对于初学者来说,Stream.Read和Stream.Write与byte []一起工作,编码等...

4> Spencer Rupo..:

除非你真的关心性能,我的意思是"你为什么使用.Net而不是C++?" 你应该坚持使用List <>.它更容易维护,并为您在幕后调整阵列大小的所有脏工作.(如果需要,List <>非常聪明地选择数组大小,因此通常不需要.)


"你为什么使用.Net而不是C++?" XNA

5> Herman Schoe..:

当集合本身的不变性是客户端和提供者代码之间的契约的一部分(不一定是集合中项目的不变性)和IEnumerable不适合时,应该优先使用数组.

例如,

var str = "This is a string";
var strChars = str.ToCharArray();  // returns array

很明显,"strChars"的修改不会改变原始的"str"对象,而与"str"的底层类型的实现级知识无关.

但是假设那样

var str = "This is a string";
var strChars = str.ToCharList();  // returns List
strChars.Insert(0, 'X');

在这种情况下,单独的代码片段不清楚插入方法是否会改变原始的"str"对象.它需要String的实现级知识才能做出决定,从而打破了"按合同设计"的方法.在String的情况下,它并不是什么大问题,但在几乎所有其他情况下它都是一个大问题.将List设置为只读确实有帮助,但会导致运行时错误,而不是编译时.

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有