使用linq对嵌套列表进行分组
我有一个嵌套的对象列表。 我需要通过identifierA
和Sum
对其数字属性进行分组,嵌套列表应分别分组:
public class TypeA { public String identifierA{ get; set; } public Int32 number { get; set; } public List nestedList { get; set; } } public class TypeB { public String identifierB { get; set; } public Int32 otherNumber { get; set; } }
所以我期待这样的事情:
var List 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();
我认为这将解决您的问题。
List 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
采用IEnumerable
并将所有SomethingWithAnIEnumerable
的选定IEnumerable
s展平为单个IEnumerable
:
nestedList = groupedData.SelectMany(pa => pa.nestedList).ToList()
使用SelectMany
如果要将列表分组为一个用途
nestedList = groupedData.SelectMany(d=>d.nestedList)
如果你想要该列表的Sum
,请使用
nestedList = groupedData.SelectMany(d=>d.nestedList).Sum(o=>o.otherNumber)
我认为你的IdentfierB可能是某种键,你的结果应该反映Grouped和Summed TypeBs。
List 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) } }