繁体   English   中英

使用linq对嵌套列表进行分组

[英]Group nested list with linq

我有一个嵌套的对象列表。 我需要通过identifierASum对其数字属性进行分组,嵌套列表应分别分组:

public class TypeA
{
    public String identifierA{ get; set; }
    public Int32 number { get; set; }
    public List<TypeB> nestedList { get; set; }
}
public class TypeB
{
    public String identifierB { get; set; }
    public Int32 otherNumber { get; set; }
}

所以我期待这样的事情:

var List<TypeA> groupedList = (from a in TypeAList
                               group a by a.identifierA
                               into groupedData
                               select new TypeA
                               {
                                   identifierA = groupedData.Key,
                                   number = groupedData.Sum(g => g.number ),
                                   nestedList = //HOW TO GROUP NESTED PART?
                               }).ToList();

SelectMany采用IEnumerable<SomethingWithAnIEnumerable>并将所有SomethingWithAnIEnumerable的选定IEnumerable s展平为单个IEnumerable

nestedList = groupedData.SelectMany(pa => pa.nestedList).ToList()

我认为这将解决您的问题。

List<TypeA> list = TypeAList
    .GroupBy(a => a.identifierA)
    .Select(
        g =>
        new TypeA
            {
                identifierA = g.Key,
                number = g.Sum(n => n.number),
                nestedList =
                    g.SelectMany(l => l.nestedList)
                    .GroupBy(b => b.identifierB)
                    .Select(
                        gg =>
                        new TypeB
                            {
                                identifierB = gg.Key,
                                otherNumber = gg.Sum(b => b.otherNumber)
                            }).ToList()
            }).ToList();

使用SelectMany

如果要将列表分组为一个用途

nestedList = groupedData.SelectMany(d=>d.nestedList)

如果你想要该列表的Sum ,请使用

nestedList = groupedData.SelectMany(d=>d.nestedList).Sum(o=>o.otherNumber)

我认为你的IdentfierB可能是某种键,你的结果应该反映出Grouped和Summed TypeBs。

List<TypeA> groupedList = TypeAList
  .GroupBy(a => a.identifierA)
  .Select(g => new TypeA()
  {
    identierA = g.Key,
    number = g.Sum(a => a.number)
    nestedList = g.SelectMany(a => a.nestedList)
      .GroupBy(b => b.identifierB)
      .Select(g2 => new TypeB()
      {
        identifierB = g2.Key,
        otherNumber = g2.Sum(b => b.otherNumber)
      }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM