MyClass[] array;
List<MyClass> list;

当一个比另一个更可取的情况是什么?,为什么?


当前回答

它完全取决于需要数据结构的上下文。例如,如果您正在创建供其他函数或服务使用的项,则使用List是完成该任务的最佳方式。

现在,如果你有一个项目列表,你只是想在网页上显示它们,数组是你需要使用的容器。

其他回答

请记住,使用List是不可能做到这一点的:

List<string> arr = new List<string>();

arr.Add("string a");
arr.Add("string b");
arr.Add("string c");
arr.Add("string d");

arr[10] = "new string";

它生成一个异常。

相反,使用数组:

string[] strArr = new string[20];

strArr[0] = "string a";
strArr[1] = "string b";
strArr[2] = "string c";
strArr[3] = "string d";

strArr[10] = "new string";

但是对于数组,不会自动调整数据结构的大小。您必须手动或使用Array管理它。调整方法。

一个技巧是用一个空数组初始化List。

List<string> arr = new List<string>(new string[100]);

arr[10] = "new string";

但在这种情况下,如果你使用Add方法添加一个新元素,它将被注入到列表的末尾。

List<string> arr = new List<string>(new string[100]);

arr[10] = "new string";

arr.Add("bla bla bla"); // this will be in the end of List

实际上,我只是想添加一个链接,我很惊讶还没有提到:Eric的Lippert的博客条目“数组被认为有点有害”。

您可以从标题中判断,它建议在任何可行的地方使用集合——但正如Marc正确地指出的那样,在很多地方,数组确实是唯一可行的解决方案。

除非你真的关心性能,我的意思是,“你为什么使用。net而不是c++ ?”你应该坚持使用List<>。它更容易维护,并为您在幕后完成调整数组大小的所有繁琐工作。(如果有必要,List<>在选择数组大小方面非常聪明,所以通常不需要这样做。)

因为没有人提到:在c#中,数组是一个列表。MyClass[]和List<MyClass>都实现了IList<MyClass>。(例如void Foo(IList<int> Foo)可以像Foo(new[]{1,2,3})或Foo(new List<int>{1,2,3})一样调用)

因此,如果你正在编写一个接受List<MyClass>作为参数的方法,但只使用功能的子集,你可能想声明为IList<MyClass>,以方便调用者。

细节:

为什么数组实现IList? 如何在c#数组部分实现IList<T>?

在现实中,很少需要使用数组。当您想添加/删除数据时,一定要使用List<T>,因为调整数组的大小是非常昂贵的。如果您知道数据是固定长度的,并且由于某些非常特定的原因(在基准测试之后)想要进行微观优化,那么数组可能会很有用。

List<T>提供了比数组更多的功能(尽管LINQ稍微均衡了一点),并且几乎总是正确的选择。当然,除了参数参数。- p;

当counter - List<T时,>是一维的;比如你已经有了int[,]或string[,,]这样的矩形数组,但是在对象模型中还有其他方法来建模这样的数据(如果你需要的话)。

参见:

如何/何时在c#.net中放弃使用数组? 数组,重点是什么?

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

它做了很多位移动,所以字节[]对于编码非常重要; 我使用一个本地滚动字节[]缓冲区,我在发送到底层流(和v.v v.)之前填充;比BufferedStream等更快; 它在内部使用基于数组的对象模型(Foo[]而不是List<Foo>),因为大小一旦构建就固定了,并且需要非常快。

但这绝对是个例外;对于一般业务线处理,List<T>每次都胜出。