【问题标题】:Initialize a List<List<T>> with default values使用默认值初始化 List<List<T>>
【发布时间】:2016-10-29 06:21:03
【问题描述】:

用默认值(T 类型)初始化List&lt;T&gt; 的方法之一是

List&lt;int&gt; foo = new List&lt;int&gt;(new int[5]);

这将创建一个包含 5 个零的列表。 List&lt;List&lt;T&gt;&gt; 你会怎么做?

我知道我们可以使用 for 循环或使用 Enumerate.Repeat 来做到这一点(但这会创建一个深层副本),但想知道它是否可以像上面那样完成?

【问题讨论】:

  • new List&lt;T&gt;(new List&lt;T&gt;())new List&lt;T&gt;(new List&lt;T&gt;(default(T)))?
  • var foo = new List&lt;int&gt;(Enumerable.Range(1, 5).Select(i =&gt; new List&lt;int&gt;());5 替换为您想要的任意多个内部列表。
  • 您的示例调用this constructor。这有效:var a = new List&lt;List&lt;int&gt;&gt;(new List&lt;int&gt;[5]);,但显然您需要迭代 5 个元素并实例化每个列表。没有像这样的任何其他constructors,意思是不,我没有看到初始化嵌套列表的默认方法。请注意,Enumerable.Repeat.Select 或等效项中基本上隐藏了 for 循环,也就是说,您在语法上可能会隐藏循环,但它仍然存在。
  • List 的默认值为 null。所以 new List>(new List[5]) 将使用默认值(nulls)。如果要创建新列表,可以尝试 new List>(new List[] { new T[5].ToList(), new T[5].ToList() })跨度>

标签: c#


【解决方案1】:

您可以使用collection initializer 来初始化具有内联预定值的列表。

    object a, b, c, d, e;
    var foo = new List<object>()
    {
        a, b, c, d, e
    };

如果你想用同一个对象的多个实例来初始化一个列表,List 类没有给出任何解决方案。您可能应该坚持使用循环。

如果您正在寻找巧妙的技巧,可以尝试:

var foo = new List<int>(Enumerable.Range(1, 5).Select(x => 42));
var bar = new List<string>(Enumerable.Range(1, 5).Select(x => "default"));
var far = new List<object>(Enumerable.Range(1, 5).Select(x => new object()));

但不要告诉任何人我说过。

【讨论】:

    【解决方案2】:

    没办法自己创建子类,没办法。

    【讨论】:

    • 这并没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方留下评论。 - From Review
    • 这是正确的答案,只是不是他想听到的。
    猜你喜欢
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 2021-04-05
    • 2011-05-12
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多