.NET提供了一个通用的列表容器,其性能几乎相同(请参阅数组与列表的性能问题)。然而,它们在初始化方面有很大的不同。
数组很容易用默认值初始化,而且根据定义,它们已经有了一定的大小:
string[] Ar = new string[10];
它允许一个人安全地分配随机项目,比如:
Ar[5]="hello";
有了list,事情就更加棘手了。我可以看到两种执行相同初始化的方法,这两种方法都不是您所说的优雅:
List<string> L = new List<string>(10);
for (int i=0;i<10;i++) L.Add(null);
或
string[] Ar = new string[10];
List<string> L = new List<string>(Ar);
什么是更干净的方式?
编辑:到目前为止,答案指的是容量,这与预先填充列表不同。例如,在刚刚创建的容量为10的列表上,不能执行L[2]="somevalue"
编辑2:人们想知道为什么我要以这种方式使用列表,因为这不是他们打算使用的方式。我可以看到两个原因:
发布于 2009-01-21 21:00:19
我不能说我经常需要这个-你能给出更多的细节来说明你为什么想要这个吗?我可能会把它作为一个静态方法放在一个helper类中:
public static class Lists
{
public static List<T> RepeatedDefault<T>(int count)
{
return Repeated(default(T), count);
}
public static List<T> Repeated<T>(T value, int count)
{
List<T> ret = new List<T>(count);
ret.AddRange(Enumerable.Repeat(value, count));
return ret;
}
}
您可以使用Enumerable.Repeat(default(T), count).ToList()
,但由于缓冲区大小的调整,这样做的效率会很低。
请注意,如果T
是引用类型,它将存储为value
参数传递的引用的count
副本-因此它们都将引用相同的对象。这可能是您想要的,也可能不是,这取决于您的用例。
编辑:正如注释中所述,如果愿意,您可以让Repeated
使用循环来填充列表。这也会稍微快一点。就我个人而言,我发现使用Repeat
的代码更具描述性,并怀疑在现实世界中性能差异是无关紧要的,但您的里程可能会有所不同。
发布于 2009-03-10 20:04:09
List<string> L = new List<string> ( new string[10] );
发布于 2009-01-21 20:56:17
使用以int (“an”)作为参数的构造函数:
List<string> = new List<string>(10);
编辑:我应该补充说,我同意Frederik的观点。你使用列表的方式与最初使用它背后的整个理由背道而驰。
EDIT2:
EDIT 2:我目前正在编写的是一个基类,作为更大框架的一部分提供默认功能。在我提供的默认功能中,列表的大小是高级已知的,因此我可以使用数组。但是,我希望为任何基类提供动态扩展它的机会,因此我选择列表。
为什么会有人需要知道所有空值的列表的大小?如果列表中没有实值,我希望长度为0。无论如何,这一事实表明它与该类的预期用途背道而驰。
https://stackoverflow.com/questions/466946
复制相似问题