从linq查询创建<key,list <value >>

时间:2018-06-30 11:56:49

标签: c# linq

我有两种型号-国家:

  public int id { get; set; }

  public string CountryName { get; set; }

和FlagColor:

    public int id { get; set; }

    public string Color { get; set; }

    public virtual Country Country { get; set; }

我正在尝试从linq查询创建一个对象,该查询将输出

的对象

>

目前我有

            var combinedList = from c in countries
            join fc in flagColors on c.id equals fc.Country.id
            select new {c, fc};

这几乎到了,但是每个flagColor返回一行,例如

比利时:红色

比利时:黑色 等等

如何将查询转换为输出:

贝尔吉姆(Belguim):{红色,黑色,黄色}

2 个答案:

答案 0 :(得分:1)

提示:在LINQ中,您几乎不需要使用连接,大多数情况下,它是通过关系隐含的。

var combinedList = from fc in flagColors
                   group fc by fc.Country into g
                   select new
                   {
                       Country = g.Key.CountryName,
                       FlagColors = string.Join(",", g.Select(x => x.Color))
                   };

注意:我将其设为易于阅读的逗号分隔值。对于列表,您可以执行以下操作:

var combinedList = from fc in flagColors
                       group fc by fc.Country into g
                       select new
                       {
                           Country = g.Key.CountryName,
                           FlagColors = g.Select(x => x.Color).ToList()
                       };

或者如果您想获取字典:

var combinedList = (from fc in flagColors
                   group fc by fc.Country into g
                   select new
                   {
                       Country = g.Key.CountryName,
                       FlagColors = g.Select(x => x.Color).ToList()
                   }).ToDictionary(l => l.Country, l=>l.FlagColors);

更短:

var combinedList = flagColors
                   .GroupBy(fc => fc.Country)
                   .ToDictionary(
                       g => g.Key.CountryName, 
                       g=>g.Select(c => c.Color).ToList()
                    );

答案 1 :(得分:1)

使用Queryable.GroupBy(或相应的Enumerable.GrouBy)

首先将所有标记颜色分组到所有标记颜色都具有相同countryName的组中。然后从每个组中创建一个对象,并使用该区域的国家名称和所有标记颜色的列表:

var result = flagColors
    .GroupBy(flagColor => flagColor.Country.CountryName)
    .Select(group => new
    {
        CountryName = group.Key,                         // get common CountryName
        FlagColors = group                               // get the color of all elements
            .Select(groupElement => groupElement.Color)  // in the group
            .ToList(),
    })