如何在linq中汇总子列表?

chu*_*nce 5 c# linq asp.net-mvc

我想在列表的子列表中求和一个属性...示例:

我有:

public class List1 {
public List<List2> List2 { get; set; }
}

public class List2 {
public int TotalUnits { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

在我看来,我有一个List<List1>,所以我想做一些像:

<%= Model.List1.Where(x.List2.Any()).Sum(x=>x.TotalUnits) .%>
Run Code Online (Sandbox Code Playgroud)

显然Sum之后的所有内容都不起作用,但是有没有办法在一行中完成这个,而不必在我的服务器端创建一个新的Dto?

Jar*_*Par 13

你是想TotalUnits在每个List2例子中得到所有的总和吗?如果是,请执行以下操作

<%= Model.List1.SelectMany(x => x.List2).Sum(x => x.TotalUnits) %>
Run Code Online (Sandbox Code Playgroud)

这是如何工作的

Model.List1.SelectMany(x => x.List2)
Run Code Online (Sandbox Code Playgroud)

这需要List<List1>并将其转换为IEnumerable<List2>. SelectMany类似于Select它是枚举中元素的投影,除了它期望可枚举的结果.然后将可枚举结果的集合放入单个可枚举中.或者用简单的话来说,它会使列表列表变得平坦.

.Sum(x => x.TotalUnits)
Run Code Online (Sandbox Code Playgroud)

这只是总结的TotalUnits成员List2.

你的代码中也有一个小错字.我相信它应该如下所示(注意缺少的class关键字)

public int TotalUnits { get; set;}
Run Code Online (Sandbox Code Playgroud)