C#如何优雅实现Transaction列表到PersonStats列表的类型转换
实现方案
你可以通过LINQ的分组操作非常简洁地完成转换,不需要复杂的循环逻辑:
前置依赖
需要先引入LINQ命名空间:
using System.Linq;
核心转换代码
List<PersonStats> personStatsList = transactions // 按姓名组合作为分组键,保证同一个人的记录归为一组 .GroupBy(t => new { t.FirstName, t.LastName }) .Select(group => { // 可选:按日期升序排序,保证日期和里程数组的顺序是时间先后顺序 var sortedRecords = group.OrderBy(t => t.Date).ToList(); return new PersonStats( firstName: group.Key.FirstName, lastName: group.Key.LastName, dates: sortedRecords.Select(t => t.Date).ToArray(), kilomtersWalked: sortedRecords.Select(t => t.KilometersWalked).ToArray() ); }) .ToList();
补充说明
- 如果你的业务场景不需要保证日期的先后顺序,可以去掉
OrderBy排序步骤,直接操作分组内的原始数据即可,性能更高 - 分组键使用
FirstName和LastName的组合匿名类,避免出现同姓不同名、同名不同姓的用户被错误分到同一组的问题 - 如果后续需要扩展
PersonStats的统计属性(比如总步行里程、日均里程等),可以直接在Select投影逻辑中通过group.Sum(t => t.KilometersWalked)、group.Average(t => t.KilometersWalked)等方法直接计算,不需要额外遍历
内容的提问来源于stack exchange,提问作者Mads
相关产品推荐
相关产品推荐

