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

本文关键字:结构 转换 将父 | 更新日期: 2023-09-27 18:09:56

我正在研究一个项目,我需要能够将复杂的父级子结构转换为其子级父级结构,这是必要的,因为对数据的查询和报告需要从父级或子级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 };
    }
}

我想知道的是如何从我的扁平的颜色列表(我的样本中的allcolors变量)得到它的结构根据我的问题。如果您能提供帮助,我将不胜感激。

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

GroupBy color基本上会给你想要的格式:

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() };