c# - 转换集合

标签 c# .net 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 }
]

需要:

[
    { A = 1, Bs = [ 1, 2 ] }
    { A = 2, Bs = [ 3, 4 ] }
    { A = 1, Bs = [ 5 ] }
    { A = 3, Bs = [ 6 ] }
]

这样的 LINQ 有可能吗?

注意:顺序很重要。所以 Bs = [5] 不能与 Bs = [1, 2]

合并

最佳答案

给定这些简单的类:

class C {
  public int A;
  public int B;
}
class R {
  public int A;
  public List<int> Bs = new List<int>();
}

你可以这样做:

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

注意:在上面我假设必须对 B 和 A 进行排序。如果不是这种情况,只需删除排序说明即可:

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

关于c# - 转换集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11512898/

相关文章:

.net - 可空类型的 LINQ 聚合行为

C# 文件到字典,但采用单词对

C# 反射(reflect)未知的子类型

c# - 该表中的位置没有行的编程问题

c# - 如何使用 ResourceExposureAttribute 和 ResourceConsumptionAttribute?

c# - 如何将旧的 WinForms 项目迁移到新的 VS2017 项目格式

c# - 为什么我不能使用与数组声明分开的数组初始化语法?

c# - WCF 中 URI 模板中的附加/可选查询字符串参数

c# - 在 WPF 的 ControlTemplate 中将焦点设置在控件上

performance - 使用贪婪的 LINQ 运算符如何改变性能?