【问题标题】:Auto-initializing C# lists自动初始化 C# 列表
【发布时间】:2015-09-16 08:05:07
【问题描述】:

我正在创建一个新的 C# 列表 (List<double>)。除了对列表进行循环之外,有没有办法将所有起始值初始化为 0?

【问题讨论】:

  • 这是可行的,但 .net 中的列表没有定义的大小,所以它是一种点点

标签: c# .net list collections


【解决方案1】:

除了提供的功能解决方案(使用Enumerable 类上的静态方法),您还可以在构造函数中传递doubles 数组。

var tenDoubles = new List<double>(new double[10]);

这是可行的,因为double 的默认值已经是 0,而且性能可能会稍微好一些。

【讨论】:

  • 我怀疑它的性能实际上会稍差一些。 List&lt;T&gt; 构造函数复制它的数组,所以这个方法分配了两个数组。 LINQ 方法使用迭代器而不分配太多内存。另一方面,给它一个数组将允许它使用正确的大小,如果元素多于List&lt;T&gt; 的默认容量,这将保存数组调整大小。 (8,IIRC)
  • @SLaks,有趣的一点。我想你是对的。这可能取决于初始大小。对于较小的初始大小,函数式方法可能稍微更有效,其中较大的初始大小肯定会在数组初始化器中表现得更好。不过,最后,我认为性能断言可能充其量只是学术性的,因为它可能永远不会对真正的生产应用程序产生影响。
  • 这与问题略有不同,但我认为它可能对一些最初来此问题寻求帮助的人有用。您可以随时更改列表的容量,以最大限度地提高效率。 NameOfList.Capacity = 5000; // 将列表的大小设置为 5000,而不实际添加到列表中或从列表中删除。
  • 请记住,对于大型列表,不建议这样做,因为您将初始化两个 10 的数组(新的 double[10] 将生成 10 个双精度,List 将在内部复制它)。对于 10 来说很好,但假设您必须初始化一个包含 1e6 个元素的数组,而不是最终使用 2 倍的时间/内存来完成。
  • 除了它复制已经在数组中创建的值。对于性能关键的应用程序来说太糟糕了。
【解决方案2】:

你可以使用初始化器:

var listInt = new List<int> {4, 5, 6, 7};
var listString = new List<string> {"string1", "hello", "world"};
var listCustomObjects = new List<Animal> {new Cat(), new Dog(), new Horse()};

所以你可以使用这个:

var listInt = new List<double> {0.0, 0.0, 0.0, 0.0};

否则,使用默认构造函数,List 将为空。

【讨论】:

  • "否则,使用默认构造函数,List 将被初始化为 0 个元素。"需要明确的是,该列表将是空的,而不是所有条目都设置为默认值。
  • 请记住,这仅适用于 VS2008/C#3/VB9 而不适用于早期版本 (VS2005/C#2/VB8)
  • 嗯,没错...我只是假设它是因为他提到了 C# List 而不是 ArrayList 或类似的东西;但我值得一提
【解决方案3】:

使用此代码:

Enumerable.Repeat(0d, 25).ToList();
new List<double>(new double[25]);     //Array elements default to 0

【讨论】:

  • 我认为这更符合 OP 的要求。
  • 第一个应该是 var list = Enumerable.Repeat(0d, 25).ToList();
【解决方案4】:

一种可能性是使用Enumerable.Range

int capacity;
var list = Enumerable.Range(0, capacity).Select(i => 0d).ToList();

另一个是:

int capacity;
var list = new List<double>(new double[capacity]);

【讨论】:

    【解决方案5】:

    有点晚了,但也许仍然感兴趣: 使用 LINQ,试试

    var initializedList = new double[10].ToList()

    ...希望避免复制列表(现在取决于 LINQ)。

    这应该是对 Michael Meadows 回答的评论,但我缺乏声誉。

    【讨论】:

      【解决方案6】:

      对于更复杂的类型:

      List<Customer> listOfCustomers =
              new List<Customer> {
                  { Id = 1, Name="Dave", City="Sarasota" },
                  { Id = 2, Name="John", City="Tampa" },
                  { Id = 3, Name="Abe", City="Miami" }
              };
      

      从这里:David Hayden's Blog

      【讨论】:

      • 这对处理双精度值的默认值没有任何帮助。
      猜你喜欢
      • 2023-03-19
      • 2017-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多