首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将List<T>初始化为给定大小(而不是容量)?

如何将List<T>初始化为给定大小(而不是容量)?
EN

Stack Overflow用户
提问于 2009-01-21 20:54:23
回答 16查看 252.8K关注 0票数 145

.NET提供了一个通用的列表容器,其性能几乎相同(请参阅数组与列表的性能问题)。然而,它们在初始化方面有很大的不同。

数组很容易用默认值初始化,而且根据定义,它们已经有了一定的大小:

代码语言:javascript
运行
复制
string[] Ar = new string[10];

它允许一个人安全地分配随机项目,比如:

代码语言:javascript
运行
复制
Ar[5]="hello";

有了list,事情就更加棘手了。我可以看到两种执行相同初始化的方法,这两种方法都不是您所说的优雅:

代码语言:javascript
运行
复制
List<string> L = new List<string>(10);
for (int i=0;i<10;i++) L.Add(null);

代码语言:javascript
运行
复制
string[] Ar = new string[10];
List<string> L = new List<string>(Ar);

什么是更干净的方式?

编辑:到目前为止,答案指的是容量,这与预先填充列表不同。例如,在刚刚创建的容量为10的列表上,不能执行L[2]="somevalue"

编辑2:人们想知道为什么我要以这种方式使用列表,因为这不是他们打算使用的方式。我可以看到两个原因:

  1. One可以很有说服力地认为列表是“下一代”数组,增加了灵活性,几乎不会有任何损失。因此,默认情况下应该使用它们。我要指出的是,它们可能不像initialize.
  2. What那么容易我目前正在写的是一个基类,它作为更大的框架的一部分提供默认功能。在我提供的默认功能中,列表的大小是高级已知的,因此我可以使用数组。但是,我希望为任何基类提供动态扩展它的机会,因此我选择列表。
EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2009-01-21 21:00:19

我不能说我经常需要这个-你能给出更多的细节来说明你为什么想要这个吗?我可能会把它作为一个静态方法放在一个helper类中:

代码语言:javascript
运行
复制
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的代码更具描述性,并怀疑在现实世界中性能差异是无关紧要的,但您的里程可能会有所不同。

票数 96
EN

Stack Overflow用户

发布于 2009-03-10 20:04:09

代码语言:javascript
运行
复制
List<string> L = new List<string> ( new string[10] );
票数 167
EN

Stack Overflow用户

发布于 2009-01-21 20:56:17

使用以int (“an”)作为参数的构造函数:

代码语言:javascript
运行
复制
List<string> = new List<string>(10);

编辑:我应该补充说,我同意Frederik的观点。你使用列表的方式与最初使用它背后的整个理由背道而驰。

EDIT2:

EDIT 2:我目前正在编写的是一个基类,作为更大框架的一部分提供默认功能。在我提供的默认功能中,列表的大小是高级已知的,因此我可以使用数组。但是,我希望为任何基类提供动态扩展它的机会,因此我选择列表。

为什么会有人需要知道所有空值的列表的大小?如果列表中没有实值,我希望长度为0。无论如何,这一事实表明它与该类的预期用途背道而驰。

票数 23
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/466946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档