如何按OrderNumber和CreatedDate分组转换PartOrders列表结构?
高效实现PartOrders列表的分组转换
最优方案:使用LINQ的GroupBy方法
利用LINQ的GroupBy可以简洁高效地完成分组合并,无需手动遍历判断,代码可读性和执行效率都远优于传统foreach循环。
注意:为避免类名冲突,建议给新旧PartOrders类重命名(比如旧类叫OriginalPartOrders,新类叫GroupedPartOrders),转换代码如下:
// 重命名后的类定义 public class OriginalPartOrders { public string orderNumber{ get; set; } public DateTime createdDate { get; set; } public string description { get; set; } public string name{ get; set; } public DateTime performedDateTime { get; set; } public Category category { get; set; } } public class GroupedPartOrders { public string orderNumber { get; set; } public DateTime createdDate { get; set; } public List<Data> orderDate { get; set; } } public class Data { public string description { get; set; } public string name { get; set; } public DateTime performedDateTime { get; set; } public Category category { get; set; } } public class Category { public string type { get; set; } public string Name { get; set; } } // 核心转换逻辑 List<OriginalPartOrders> originalList = GetOriginalPartOrders(); // 替换为你的原始列表 List<GroupedPartOrders> groupedList = originalList .GroupBy(o => new { o.orderNumber, o.createdDate }) // 按orderNumber+createdDate组合分组 .Select(g => new GroupedPartOrders { orderNumber = g.Key.orderNumber, createdDate = g.Key.createdDate, orderDate = g.Select(item => new Data { description = item.description, name = item.name, performedDateTime = item.performedDateTime, // 若需独立的Category实例而非共享引用,可手动深拷贝属性 category = new Category { type = item.category.type, Name = item.category.Name } }).ToList() }) .ToList();
关键细节说明
- 分组逻辑:用匿名类型
new { o.orderNumber, o.createdDate }作为分组键,确保两个字段完全匹配的项被归为同一组。 - 性能优势:LINQ的
GroupBy内部基于哈希表实现,时间复杂度为O(n),远优于手动foreach嵌套判断的O(n²),数据量越大优势越明显。 - 引用类型处理:如果
Category是引用类型,直接赋值会导致多个Data对象共享同一实例,需要深拷贝时可按代码示例手动复制属性。
内容的提问来源于stack exchange,提问作者Junior.netare
相关产品推荐
相关产品推荐

