如何在C#中按可变需求量对多组值进行分组
按需求分组的数组拆分实现方案
核心逻辑是先确定能组成多少组完整的需求集合,再根据组数生成对应的分组结果:
步骤拆解
- 统计实际数量:先对输入的
values数组按值分组,统计每个值的总出现次数。 - 计算最大组数:对每个配置项,用「实际数量 ÷ 需求数量」取整数部分,所有配置项的这个结果里的最小值,就是能组成的完整需求组数(记为
maxSets)。 - 生成分组结果:对每个配置项,生成
maxSets个包含对应需求数量的分组,最终汇总所有分组得到结果。
C# 代码实现
using System; using System.Collections.Generic; using System.Linq; public class Program { public class ConfigItem { public char Value { get; set; } public int AmountRequired { get; set; } } public static List<List<char>> GetGroupedResults(ConfigItem[] config, char[] values) { // 统计每个值的实际出现次数 var valueCounts = values.GroupBy(v => v) .ToDictionary(g => g.Key, g => g.Count()); // 计算最大可组成的完整需求组数 int maxSets = config.Min(item => valueCounts.TryGetValue(item.Value, out int count) ? count / item.AmountRequired : 0); // 生成结果集合 var results = new List<List<char>>(); foreach (var item in config) { for (int i = 0; i < maxSets; i++) { results.Add(Enumerable.Repeat(item.Value, item.AmountRequired).ToList()); } } return results; } public static void Main() { // 测试示例1:完全匹配需求 var config = new[] { new ConfigItem { Value = 'A', AmountRequired = 1 }, new ConfigItem { Value = 'B', AmountRequired = 2 }, new ConfigItem { Value = 'C', AmountRequired = 3 }, new ConfigItem { Value = 'D', AmountRequired = 4 } }; var values1 = new[] { 'A', 'B', 'B', 'C', 'C', 'C', 'D', 'D', 'D', 'D' }; var results1 = GetGroupedResults(config, values1); PrintResults(results1); // 测试示例2:每个值多一个 var values2 = new[] { 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C', 'C', 'D', 'D', 'D', 'D', 'D' }; var results2 = GetGroupedResults(config, values2); PrintResults(results2); } private static void PrintResults(List<List<char>> results) { Console.WriteLine("输出结果:"); foreach (var group in results) { Console.WriteLine($"[{string.Join(", ", group.Select(c => $"'{c}'"))}]"); } Console.WriteLine(); } }
代码说明
- 统计数量时用
GroupBy+ToDictionary快速获取每个值的总数,处理不存在的配置值时默认计数为0,避免报错。 - 计算
maxSets时取所有配置项的「可分组数」最小值,确保所有配置项都能满足组数要求,多余的单个值会被自动忽略。 - 生成结果时,按配置项循环生成对应组数的分组,完全匹配需求格式。
内容的提问来源于stack exchange,提问作者marcuthh
相关产品推荐
相关产品推荐

