c# - C# 将嵌套列表展平为不同对象的列表以在数据网格中显示
问题描述
我在 WPF Datagrid 中显示我的嵌套集合时遇到问题。下面是给我想要的结果的代码,但我想知道是否有可能让它更简单?
public async Task LoadRecepi(short id)
{
Recepi = await _recepiDataService.Get(id);
var flat = new List<FlatRecepi1>();
foreach (var step in Recepi.Step)
{
flat.Add(new FlatRecepi1 {
RecepiId = step.RecepiId,
StepId = step.SPTagId,
Activity = step.Activity,
PVTagName = step.PVTag.Name
});
foreach (var node in step.Nodes)
{
flat.Add(new FlatRecepi1
{
StepId = node.SPTagId,
SPTagName = node.SPTag.Name,
PVTagName = node.PVTag.Name
});
}
}
}
非常感谢你的帮助。
public class FlatRecepi1
{
public short RecepiId { get; set; }
public short StepId { get; set; }
public Activity Activity { get; set; }
public short NodeId { get; set; }
public string StepName { get; set; }
public string PVTagName { get; set; }
public string SPTagName { get; set; }
public Operator Operator { get; set; }
}
解决方案
您可以使用Enumerable.SelectMany
和的组合Enumerable.Prepend
。
下面的代码会将每个步骤的节点投影到一个集合中FlatRecepi1
,然后在集合开始FlatRecepi1
时将对应的步骤添加到前面。最后,将这个“集合集合”扁平化为一个列表。这应该为您提供与当前代码相同的顺序。SelectMany
var flat = Recepi.Step.SelectMany(step =>
step.Nodes.Select(node => new FlatRecepi1 {
StepId = node.SPTagId,
SPTagName = node.SPTag.Name,
PVTagName = node.PVTag.Name
}).Prepend(new FlatRecepi1 {
RecepiId = step.RecepiId,
StepId = step.SPTagId,
Activity = step.Activity,
PVTagName = step.PVTag.Name,
})
).ToList();
如果Prepend
由于您使用的是较旧的框架而对您不可用,我们可以通过以下方式实现相同的目的Enumerable.Concat
:
var flat = Recepi.Step.SelectMany(step =>
new [] {
new FlatRecepi1 {
RecepiId = step.RecepiId,
StepId = step.SPTagId,
Activity = step.Activity,
PVTagName = step.PVTag.Name,
}
}.Concat(
step.Nodes.Select(node => new FlatRecepi1 {
StepId = node.SPTagId,
SPTagName = node.SPTag.Name,
PVTagName = node.PVTag.Name
})
)
).ToList();
推荐阅读
- java - 如何减少或禁用 Flink 中的检查点日志
- angular - “在“d3”中找不到导出“鼠标”(导入为“d3”)
- reactjs - 当我部署到 Google App Engine 时,我的反应前端没有改变
- c++ - 在 C++ 中格式化字符串的最佳方法
- python - Python 脚本在 Thonny 中运行,但在终端中出现错误
- linux - 将所有文件夹和文件移动到Linux目录下主题名相同的文件夹中
- python - 由于 LC_ALL 无法更改语言环境错误,使用 pytest 启动 postgres 夹具失败
- r - 从一月到当年和上一年的最新可用月份的总和
- python - 如何确定每句否定词的数量
- dynamic - Ionic5:使用 sharedModule 在所有应用页面上设置页脚并从 app.component 控制它(开/关)