将父子结构转换为子父结构

时间:2016-10-03 12:04:16

标签: c# linq object hierarchy relationships

我正在开发一个项目,我需要能够将复杂的父子结构转换为其子父项目,这是必要的,因为需要从父项或子项pov查询和报告数据。这可能没有多大意义,但这是一个包含一些示例数据的简化版本:

假设我有这些数据:

基色(红色,蓝色,绿色) 强调色(红色,黄色,蓝色)

我想将其转换为:

红色(基色,强调色) 蓝色(基色,强调色) 绿色(基色) 黄色(强调色)

看起来Linq对此非常理想,但我无法弄明白,我知道我可以做到很长时间,但它看起来很笨重。

到目前为止,我有这个测试类可以解决:

class UsageType
{
    public string Usage { get; set; }

    public List<Colour> Colours = new List<Colour>();
}

class Colour
{
    public string Name { get; set; }
}

public class TestClass
{
    public TestClass()
    {
        var usageTypes = new List<UsageType>()
            {
                new UsageType()
                {
                    Usage = "base colours",
                    Colours = new List<Colour>()
                    {
                        new Colour() { Name = "Red"},
                        new Colour() { Name = "Blue"},
                        new Colour() { Name = "Green"}
                    }
                },
                new UsageType()
                {
                    Usage = "accent colours",
                    Colours = new List<Colour>()
                    {
                        new Colour() { Name = "Red"},
                        new Colour() { Name = "Blue"},
                        new Colour() { Name = "Yellow"}
                    }
                }
            };

        var allColours = from clr in usageTypes
                         .SelectMany(ut => ut.Colours, (clr, ut) => new { colour = ut.Name, usage = clr.Usage })
                         select new { clr.colour, clr.usage };
    }
}

我想知道的是如何从我扁平的颜色列表(我的样本中的allColours变量)到根据我的问题进行结构化。任何有关最佳方法的帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

GroupBy颜色基本上会为您提供所需的格式:

var colourUsage =
    from ut in usageTypes
    from c in ut.Colours
    group ut.Usage by c.Name into g
    select new { colour = g.Key, usages = g.ToList() };