GroupBy和Select扩展方法帮助

我正在使用以下代码尝试GroupBy几个字段:

var cars = tmp.Select(a => new { a.Make, a.Model, a.Year }); cars = cars.Distinct() .OrderBy(a => a.Make) .ThenBy(a => a.Model); var groupedCars = cars.GroupBy(a => new { a.Make, a.Model }) .Select(b => new { b.Make, b.Model, b.Year }); 

不幸的是,最后一行代码给了我错误,因为无法识别这三个字段。

‘System.Linq.IGrouping(AnonymousType#1,AnonymousType#2)’不包含’Make’的定义,也没有扩展方法’Make’接受类型’System.Linq.IGrouping的第一个参数(AnonymousType#1,AnonymousType) #2)’可以找到(你是否错过了使用指令或程序集引用?)

所有三个字段(Make,Model,Year)都是相同的错误。

任何想法如何解决这一问题?

按照品牌和型号对汽车进行分组后,序列的每个元素都是一个组。 你可以获得具有Key属性的组的Key ,因此你可以找到该组的MakeModel ,但是Year没有意义……每组中将有多辆汽车,并且它们都可以有不同的年份。 当然,您可以使用组的信息。 例如:

 var groupedCars = cars.GroupBy(a => new { a.Make, a.Model }) .Select(g => new { g.Key.Make, g.Key.Model, MinYear = g.Min(car => car.Year), MaxYear = g.Max(car => car.Year) }); 

但从根本上说,你需要考虑这样一个事实,即序列的每个元素都是一个群体,而不是一辆汽车。

我不打算与Skeet的逻辑争辩,因为我的回答是类似的。

但我的建议是删除Select投影,该投影执行总结年份的结果选择器。 这可以通过使用执行相同过程的GroupBy重载来完成。

 cars.GroupBy (car => new { car.Make, car.Model }, // Key selector for make and model as keys vehicle => vehicle, // Element selector, we want all items of the original car instance which has the year (key, vehicle) => new // Result selector, we want to sum up the min/max year of vehicle. { Make = key.Make, Model = key.Model, MinYear = vehicle.Min (car => car.Year), MaxYear = vehicle.Max (car => car.Year) } ); 

结果如下所示:

在此处输入图像描述

关于这个数据:

 var cars = new List { new Car() { Make="Dodge", Model="Charger", Year=2007}, new Car() { Make="BMW", Model="M6", Year=2007}, new Car() { Make="Dodge", Model="Charger", Year=2012}, new Car() { Make="BMW", Model="X1", Year=2013}, new Car() { Make="BMW", Model="X1", Year=2014}, };