You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按产品分组对象列表并将同产品固定分配到指定天数统计

解决方案:按指定天数分组统计产品(同类型产品同天统计)

核心思路

  1. 先按产品类型完成分组,确保同一类型的所有产品归为一组
  2. 将这些产品类型组分配到指定的统计天数中,保证同类型产品只出现在一天
  3. 校验统计天数不超过产品类型总数,避免无效分配
  4. 按天格式化输出统计结果

完整代码实现

首先定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:50:22