如何将此手动代码转换为使用 Enumerable.Range 来初始化我的多维 属性?

How to I convert this manual code into using Enumerable.Range to initialize my multi-dimensional property?

此问题与此处答案中的代码示例相关 ()。

我现在有了这个构造函数:

public List<MSAHistoryItemStudent>[] StudentItems { get; set; }
public MSAHistoryWeek()
{
    TalkItems = Enumerable.Range(1, 6).Select(x => new MSAHistoryItemTalk()).ToList();
    Teaching = Enumerable.Range(1, 3).Select(x => string.Empty).ToList();
    StudentItemStudyNumbers = Enumerable.Range(1, 5).Select(x => string.Empty).ToList();
    StudentItemDescriptions = Enumerable.Range(1, 5).Select(x => string.Empty).ToList();

    StudentItems = new List<MSAHistoryItemStudent>[]
    {
        new List<MSAHistoryItemStudent>(),
        new List<MSAHistoryItemStudent>(),
        new List<MSAHistoryItemStudent>(),
    };

    foreach(var studentitems in StudentItems)
    {
        for(int i = 0; i < 5; i++)
        {
            studentitems.Add(new MSAHistoryItemStudent());
        }
    }
}

我无法想出 Enumerable.Range 方法来预创建 StudentItems 我想要的方式:

只需在 Select 调用中嵌套另一个 Enumerable.Range(...)... 调用。

StudentItems =
    Enumerable.Range(1, 3).Select(x =>
        Enumerable.Range(1, 5).Select(y =>
            new MSAHistoryItemStudent()
        ).ToList()
    ).ToArray();

由于列表数量相对较少,您可以将对 new 的调用替换为对 Enumerable.Range:

的调用
StudentItems = new 
{
    Enumerable.Range(1, 5).Select(x => new MSAHistoryItemStudent()).ToList(),
    Enumerable.Range(1, 5).Select(x => new MSAHistoryItemStudent()).ToList(),
    Enumerable.Range(1, 5).Select(x => new MSAHistoryItemStudent()).ToList(),
};

顺便说一句,如果你把它放在某个地方:

public static List<T> MakeN<T>(int n) where T:new()
  => Enumerable.Range(1,n).Select(x => new T()).ToList();

然后你可以简化这些调用:

TalkItems = MakeN<MSAHistoryItemTalk>(6);
Teaching = new string[3].ToList();

StudentItems = new
{
    MakeN<MSAHistoryItemStudent>(5),
    MakeN<MSAHistoryItemStudent>(5),
    MakeN<MSAHistoryItemStudent>(5),
};

以及您在其他任何地方使用 Enumerable.Range.Select.

...除了你在哪里做 string(我已经给出了另一种形式)。