LinqGroupby如何求和不同的4个模型值

本文关键字:4个 模型 何求和 求和 LinqGroupby | 更新日期: 2023-09-27 18:26:37

我有三个模型属性,比如:

public decimal Date{ get; set; }
public decimal Money{ get; set; }
public string CityId{ get; set; } // grouping property

我需要按"城市ID"分组,而不是选择按"城市Id"分组的日期和金钱。

代码:

var results = model.Select(x => new MyViewModel(){ 
                                    Date= x.Date,
                                    Money= x.Money,
                                    CityId= x.CityId,
                 }).GroupBy(x=>x.CityId)
                   .ToList();

我可以通过这个Linq查询得到我想要的东西。然后我想用这个代码匹配我的值:

 for (int i = 0; i < model.Count; i++)
 {
     NewList myList = new NewList();
     myList.Date= results[i].   // i cant get my properties(Date,Money, CityId)
     myList.Money= results[i].  // i cant get my properties(Date,Money, CityId)
     myList.CityId= results[i].  // i cant get my properties(Date,Money, CityId)
 }

拼写了几个小时后,这个代码怎么了?如何获取DateMoneyCityId属性?

LinqGroupby如何求和不同的4个模型值

GroupBy返回项目分组、一个包含所有分组项目的对象以及该组所属的键。因此,当前您的results的类型类似于List<int, IGrouping<MyViewModel>>。你要找的显然是List<MyViewModel>,你可以使用SelectMany:

var results = model.Select(x => new MyViewModel()
{ 
     Date= x.Date,
     Money= x.Money,
     CityId= x.CityId,
})
.GroupBy(x=>x.CityId)
.SelectMany(x => x)
.ToList();

这应该将您的分组扁平化为一个单独的列表,项目按组排序。

更新请注意,上面的代码假定您有意使用GroupBy。正如评论中所指出的,如果这是您唯一的用例,那么简单的OrderBy可能是更好的选择:

var results = model.Select(x => new MyViewModel()
{ 
     Date= x.Date,
     Money= x.Money,
     CityId= x.CityId,
})
.OrderBy(x => x.CityId)
.ToList();