提问人:Luis Pedro 提问时间:5/22/2023 更新时间:5/22/2023 访问量:45
可以声明的 C# 对象列表,返回要插入到主列表中的项的迭代
C# object list that can be declared, returning an iteration of items to be inserted into the main list
问:
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)]
答:
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
这是否比其他解决方案更具可读性取决于您。如果它比你在这里的例子更复杂,那么出于可读性的目的,另一个答案中建议的额外函数可能更可取。
评论