如何按产品分组对象列表并将同产品固定分配到指定天数统计
解决方案:按指定天数分组统计产品(同类型产品同天统计)
核心思路
- 先按产品类型完成分组,确保同一类型的所有产品归为一组
- 将这些产品类型组分配到指定的统计天数中,保证同类型产品只出现在一天
- 校验统计天数不超过产品类型总数,避免无效分配
- 按天格式化输出统计结果
完整代码实现
首先定义Product类(补全必要结构):
public class Product { public string Type { get; set; } public string Id { get; set; } public Product(string type, string id) { Type = type; Id = id; } // 重写ToString方便生成示例格式的输出 public override string ToString() { return $"products.Add(new Product(\"{Type}\", \"{Id}\"));"; } }
核心逻辑代码:
int scheduledDays = 2; // 可替换为3测试 var products = new List<Product> { new Product("MILK", "123"), new Product("MILK", "123"), new Product("CHAIR", "456"), new Product("CHAIR", "456"), new Product("CHAIR", "456"), new Product("TABLE", "234"), new Product("TABLE", "234"), new Product("TV", "567") }; // 1. 按产品类型分组,得到每个类型的完整产品列表 var productTypeGroups = products.GroupBy(p => p.Type) .Select(group => group.ToList()) .ToList(); // 校验统计天数合法性:不能超过产品类型总数 if (scheduledDays > productTypeGroups.Count) { throw new ArgumentException("统计天数不能超过产品类型的总数"); } // 2. 计算每个天数应分配的产品类型组数 int baseGroupsPerDay = productTypeGroups.Count / scheduledDays; int remainingGroups = productTypeGroups.Count % scheduledDays; // 3. 将产品类型组分配到对应天数(余数分配给最后N天) var dailyProductAssignments = new List<List<List<Product>>>(); int currentGroupIndex = 0; for (int dayIndex = 0; dayIndex < scheduledDays; dayIndex++) { // 最后remainingGroups个天数各多分配1个产品类型组 int groupsToAssign = baseGroupsPerDay + (dayIndex >= scheduledDays - remainingGroups ? 1 : 0); var dayGroups = productTypeGroups.GetRange(currentGroupIndex, groupsToAssign); dailyProductAssignments.Add(dayGroups); currentGroupIndex += groupsToAssign; } // 4. 按示例格式输出结果 // 先整理每天的所有产品行 var dailyRows = dailyProductAssignments.Select(dayGroups => dayGroups.SelectMany(productGroup => productGroup) .Select(product => product.ToString()) .ToList() ).ToList(); // 获取最大行数,用于对齐输出 int maxRowCount = dailyRows.Max(rowList => rowList.Count); // 输出表头 for (int day = 0; day < scheduledDays; day++) { Console.Write($" PRODUCTS TO BE COUNTED DAY {day + 1}".PadRight(40)); } Console.WriteLine(); // 逐行输出产品内容 for (int row = 0; row < maxRowCount; row++) { for (int day = 0; day < scheduledDays; day++) { string rowContent = row < dailyRows[day].Count ? dailyRows[day][row] : string.Empty; Console.Write(rowContent.PadRight(40)); if (day < scheduledDays - 1) { Console.Write("|"); } } Console.WriteLine(); }
关键逻辑说明
- 分组处理:使用
GroupBy(p => p.Type)将同类型产品聚合,确保后续分配时不会拆分同一类型 - 天数分配:通过整除和余数计算,平均分配产品类型组,余数分配给最后几天(和示例的分配逻辑一致)
- 格式化输出:计算每天的最大行数,通过
PadRight实现对齐,还原示例的输出格式
内容的提问来源于stack exchange,提问作者suc pepe
相关产品推荐
相关产品推荐

