通用合规子集生成函数开发及现有C#代码优化需求
通用合规子集生成的C#解决方案
我理解你需要一个通用的C#函数来生成符合特定规则的子集,既能处理从单元素集合生成两两组合的场景,也能处理从已筛选的多元素组合生成无重复元素的更大组合的情况。下面是一个完整的解决方案,核心是先拆解每个输入元素的原始组成,再基于原始元素的唯一性来生成合规组合:
核心思路
- 拆解输入元素:将每个输入项(无论是单元素如
"1"还是多元素组合如"12")转换成有序的原始字符集合,确保后续组合的有序性。 - 筛选无重复组合:在生成目标大小的组合时,检查选中的输入项对应的原始元素是否存在重叠,确保最终子集的原始元素完全唯一。
- 有序拼接结果:将筛选后的原始元素按升序排列并拼接成字符串,保证输出格式统一。
完整代码实现
using System; using System.Collections.Generic; using System.Linq; public class SubsetGenerator { // 辅助方法:将输入字符串拆解为有序的原始字符集合 private static SortedSet<char> ParseElement(string element) { // 使用SortedSet保证原始元素有序,避免后续拼接出现乱序 return new SortedSet<char>(element.ToCharArray()); } // 主方法:生成所有合规子集 // 参数说明: // - inputSet: 输入的集合(可以是单元素或多元素组合) // - targetUniqueCount: 最终子集需要包含的唯一原始元素数量 public static IEnumerable<string> GenerateValidSubsets(IEnumerable<string> inputSet, int targetUniqueCount) { // 将输入元素转换为(原始字符集合,原字符串)的元组列表 var parsedElements = inputSet.Select(e => (Elements: ParseElement(e), Original: e)).ToList(); // 生成所有可能的输入元素组合,组合的长度从1开始尝试(直到能凑够targetUniqueCount个原始元素) for (int comboLength = 1; comboLength <= parsedElements.Count; comboLength++) { // 获取当前长度的所有输入元素组合 foreach (var combo in GetCombinations(parsedElements, comboLength)) { // 合并所有原始元素,检查是否唯一且数量符合要求 var combinedElements = new SortedSet<char>(); bool hasDuplicate = false; foreach (var item in combo) { foreach (var c in item.Elements) { if (!combinedElements.Add(c)) { hasDuplicate = true; break; } } if (hasDuplicate) break; } // 如果原始元素数量正好等于目标值,且无重复,则拼接成结果字符串 if (!hasDuplicate && combinedElements.Count == targetUniqueCount) { yield return new string(combinedElements.ToArray()); } } } } // 通用组合生成器:从列表中获取指定长度的所有组合 private static IEnumerable<IEnumerable<T>> GetCombinations<T>(IEnumerable<T> list, int length) { if (length == 1) return list.Select(t => new T[] { t }); return GetCombinations(list, length - 1) .SelectMany(t => list.Where(e => !t.Contains(e)), (t1, t2) => t1.Concat(new T[] { t2 })); } } // 测试示例 public class Program { public static void Main() { // 场景1:初始集合生成两两组合 var initialSet = new List<string> { "1", "2", "4", "5" }; var pairwiseSubsets = SubsetGenerator.GenerateValidSubsets(initialSet, 2); Console.WriteLine("场景1结果:"); foreach (var subset in pairwiseSubsets) { Console.WriteLine(subset); } // 输出:12,14,15,24,25,45 // 场景2:筛选后的集合生成三元组合 var filteredSet = new List<string> { "12", "14", "25", "45" }; var tripleSubsets = SubsetGenerator.GenerateValidSubsets(filteredSet, 3); Console.WriteLine("\n场景2结果:"); foreach (var subset in tripleSubsets) { Console.WriteLine(subset); } // 输出:124,125,145 } }
代码说明
ParseElement方法:将输入字符串转换为SortedSet<char>,既保证原始元素的唯一性,也确保后续拼接时的有序性。GenerateValidSubsets方法:核心逻辑,遍历所有可能的输入元素组合,合并原始元素并检查是否符合“无重复、数量达标”的要求,符合条件则生成结果。GetCombinations方法:通用的组合生成工具,支持从任意列表中生成指定长度的所有组合,是实现不同层级组合的基础。
这个方案完全适配你描述的两个场景,同时也支持其他扩展场景(比如从三元组合生成四元组合,只要输入集合的元素拆解后能凑够不重复的原始元素)。
内容的提问来源于stack exchange,提问作者Reza Hatami
相关产品推荐
相关产品推荐

