如何使用lambda使用组?

时间:2014-01-20 16:47:42

标签: c# lambda group-by

我正在尝试使用lambda从表/结果集中获取数据,并生成包含其他对象列表的对象 我有一个元素列表,例如:

continent | country | state

europe    | france  | paris
europe    | france  | rouen
europe    | spain   | madrid
europe    | italy   | milan
america   | usa     | ohio
america   | usa     | kansas
america   | usa     | texas
america   | usa     | iowa
america   | mexico  | colima
america   | mexico  | tabasco
africa    | niger   | maradi
africa    | niger   | tahoua
africa    | niger   | niamey  

我需要按大陆和国家对其进行分组,以生成一个包含对象列表的对象列表......类似于:

  • 欧洲
    • 法国
      • 巴黎
      • 鲁昂
    • 西班牙
      • 马德里
    • 意大利
      • 米兰
  • 美国
    • 美国
      • 俄亥俄
      • 堪萨斯
      • 得克萨斯
      • 爱荷华
    • 墨西哥
      • 科利马
      • 塔巴斯科
  • 非洲
    • 曲霉
      • 马拉迪
      • 塔瓦
      • 尼亚美

我拥有的是:

   DataTable.GroupBy(g => new
      {
         g.continent,
         g.country
      })
   .Select(s => s.First()).ToList().ForEach(n =>
      {
         _continentals.Add(new Continent 
         {
            name = n.continent,
            countries = new List<Country> 
            {
               new Country
               {
                  name = n.country,
                  states = new List<State> 
                  {
                     new State
                     {
                        name = n.state
                     }
                  }
               }
            }
         }
      }

但它不起作用,我不知道如何解决它 (它没有按正确的顺序生成/分组元素。)

1 个答案:

答案 0 :(得分:3)

您需要按大陆分组,然后按国家/地区对每个组进行分组,而不是根据大陆/国家/地区分组一次:

var query = DataTable.GroupBy(item => item.continent,
    (key, group) => new
    {
        Continent = key,
        Countries = group.GroupBy(item => item.country)
    });