如何在linq中汇总子列表?

时间:2010-11-09 21:33:42

标签: c# asp.net-mvc linq

我想在列表的子列表中对属性求和...例如:

我有:

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

public class List2 {
public int TotalUnits { get; set; }
}

在我看来,我有一个List<List1>,所以我想做类似的事情:

<%= Model.List1.Where(x.List2.Any()).Sum(x=>x.TotalUnits) .%>

显然Sum之后的所有内容都不起作用,但有没有办法可以在一行中完成此操作而无需在服务器端创建新的Dto?

2 个答案:

答案 0 :(得分:12)

您是否尝试获取每个TotalUnits实例中所有List2的总和?如果是,那么请执行以下操作

<%= Model.List1.SelectMany(x => x.List2).Sum(x => x.TotalUnits) %>

这是如何运作的

Model.List1.SelectMany(x => x.List2)

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

.Sum(x => x.TotalUnits)

这只是TotalUnits List2成员的总和。

您的代码中也有一个小错字。我认为它应该如下所示(请注意缺少class关键字)

public int TotalUnits { get; set;}

答案 1 :(得分:2)

如果我理解正确,你会找到这样的东西:

Model.List1.Where(x => x.List2.Any()).Select(x => x.List2.Sum(y => y.TotalUnits))

这将为您提供包含元素的子列表的总和列表。