转换集合

Ser*_*lov 9 .net c# linq

有一个对象的集合.示意图:

[
    { A = 1, B = 1 }
    { A = 1, B = 2 }
    { A = 2, B = 3 }
    { A = 2, B = 4 }
    { A = 1, B = 5 }
    { A = 3, B = 6 }
]
Run Code Online (Sandbox Code Playgroud)

需要:

[
    { A = 1, Bs = [ 1, 2 ] }
    { A = 2, Bs = [ 3, 4 ] }
    { A = 1, Bs = [ 5 ] }
    { A = 3, Bs = [ 6 ] }
]
Run Code Online (Sandbox Code Playgroud)

LINQ有可能这样吗?

注意:订购很重要.所以Bs = [5]不能合并Bs = [1, 2]

Jor*_*dão 2

鉴于这些简单的类:

class C {
  public int A;
  public int B;
}
class R {
  public int A;
  public List<int> Bs = new List<int>();
}
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

var cs = new C[] {
  new C() { A = 1, B = 1 },
  new C() { A = 1, B = 2 },
  new C() { A = 2, B = 3 },
  new C() { A = 2, B = 4 },
  new C() { A = 1, B = 5 },
  new C() { A = 3, B = 6 }
};

var rs = cs.
  OrderBy(o => o.B).
  ThenBy(o => o.A).
  Aggregate(new List<R>(), (l, o) => {
    if (l.Count > 0 && l.Last().A == o.A) {
      l.Last().Bs.Add(o.B);
    }
    else {
      l.Add(new R { A = o.A, Bs = { o.B } });
    }
    return l;
  });
Run Code Online (Sandbox Code Playgroud)

注意:在上面我假设必须先对 B 进行排序,然后对 As 进行排序。如果情况并非如此,只需删除排序指令即可:

var rs = cs.
  Aggregate(new List<R>(), (l, o) => {
    if (l.Count > 0 && l.Last().A == o.A) {
      l.Last().Bs.Add(o.B);
    }
    else {
      l.Add(new R { A = o.A, Bs = { o.B } });
    }
    return l;
  });
Run Code Online (Sandbox Code Playgroud)