可以声明的 C# 对象列表,返回要插入到主列表中的项的迭代

C# object list that can be declared, returning an iteration of items to be inserted into the main list

提问人:Luis Pedro 提问时间:5/22/2023 更新时间:5/22/2023 访问量:45

问:

C# 问题。

我需要填充我的主对象属性,即自定义对象的列表,但在某些时候,我需要向此列表中添加具有特定声明的复制,但我不想为每个项目添加一行,当列表中项目的特定 ID 只有索引更改时。

如何使用将项添加到构造函数声明(或左右)上的列表的循环来做到这一点。

元代码示例:

private static readonly MainObject myObject = new()
{
  Type = "OP",
  Group = "FD",
  Items = new List<SubObject>
  {
    new SubObject("Tag.Count", 0),
    new SubObject("Tag.Min", 0),
    new SubObject("Tag.Max", 100),

    // Sub list starts here, from 1 to 10
    new SubObject("Tag.Pos.1", 1),
    new SubObject("Tag.Pos.2", 4),
    new SubObject("Tag.Pos.3", 9),
    ...
    new SubObject("Tag.Pos.10", 100),
    // Sub list ends here with 10 items

  }
}

因此,我的 SubObject 列表包含可以作为单行迭代解决的内容,但是如何在此声明中执行此操作,...比如,......我是 1 到 10 的循环项目:

            ... new SubObject(`Tag.Pos.$i`, $i^2)



寻找一个解决方案,该解决方案最终返回一个子列表,该子列表可以在声明对象时添加并包含在主列表中,由构造函数识别和接受:

在 JavaScript 中,只需行就可以返回类似于以下内容的内容:

...[new SubObject(`Tag.Pos.$i`, $i^2)]
C# 对象 构造函数 声明

评论

0赞 Jeremy Thompson 5/22/2023
您能否从文件、数据库或 API 终端节点获取这些 Tag 值?

答:

0赞 Krishna Varma 5/22/2023 #1

您可以尝试使用 for 循环

private static readonly MainObject myObject = new MainObject
{
    Type = "OP",
    Group = "FD",
    Items = GenerateSubList()
};

private static List<SubObject> GenerateSubList()
{
    List<SubObject> subList = new List<SubObject>
    {
        new SubObject("Tag.Count", 0),
        new SubObject("Tag.Min", 0),
        new SubObject("Tag.Max", 100)
    };

    for (int i = 1; i <= 10; i++)
    {
        subList.Add(new SubObject($"Tag.Pos.{i}", i * i));
    }

    return subList;
}
0赞 D Stanley 5/22/2023 #2

不能在声明块中动态添加项,但可以在构造后使用 Linq 添加项:

  Items = new List<SubObject>
  {
    new SubObject("Tag.Count", 0),
    new SubObject("Tag.Min", 0),
    new SubObject("Tag.Max", 100),

  }

  myObject.Items.AddRange(Enumerable.Range(1,10).Select(
    i => new SubObject($"Tag.Pos.{i}", i*i)
  ));

或移动“项目”生成信息,该函数在列表中返回可变数量的项目:

private static List<SubObject> GetItems(int numItems)
{
    List<SubObject> items = new List<SubObject>
    {
        new SubObject("Tag.Count", 0),
        new SubObject("Tag.Min", 0),
        new SubObject("Tag.Max", numItems*numItems)
    };

    items.AddRange(Enumerable.Range(1,numItems).Select(
      i => new SubObject($"Tag.Pos.{i}", i*i)
    ));

    return items;
}

并在构造函数中调用它:

private static readonly MainObject myObject = new()
{
  Type = "OP",
  Group = "FD",
  Items = GetItems(10)
};
0赞 nvoigt 5/22/2023 #3
Items = new List<SubObject>()
{
    new SubObject("Tag.Count", 0),
    new SubObject("Tag.Min", 0),
    new SubObject("Tag.Max", 100)
}
.Concat(Enumerable.Range(1, count).Select(x => new SubObject($"Tag.Pos.{i}", x*x))))
.ToList();

您可以到您的列表并在一个语句中创建一个新列表。Concat

这是否比其他解决方案更具可读性取决于您。如果它比你在这里的例子更复杂,那么出于可读性的目的,另一个答案中建议的额外函数可能更可取。