我想在列表的子列表中对属性求和...例如:
我有:
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?
答案 0 :(得分:12)
您是否尝试获取每个TotalUnits
实例中所有List2
的总和?如果是,那么请执行以下操作
<%= Model.List1.SelectMany(x => x.List2).Sum(x => x.TotalUnits) %>
这是如何运作的
Model.List1.SelectMany(x => x.List2)
这需要List<List1>
并将其转换为IEnumerable<List2>
。 SelectMany
与Select
类似,因为它是枚举中元素的投影,除了它需要可枚举的结果。然后将可枚举结果的集合放入单个可枚举中。或者用简单的话来说,它会使列表列表变得扁平化。
.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))
这将为您提供包含元素的子列表的总和列表。