首页 > 解决方案 > 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; }

}

标签: c#wpfdatagrid

解决方案


您可以使用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();

推荐阅读