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

通用合规子集生成函数开发及现有C#代码优化需求

通用合规子集生成的C#解决方案

我理解你需要一个通用的C#函数来生成符合特定规则的子集,既能处理从单元素集合生成两两组合的场景,也能处理从已筛选的多元素组合生成无重复元素的更大组合的情况。下面是一个完整的解决方案,核心是先拆解每个输入元素的原始组成,再基于原始元素的唯一性来生成合规组合:

核心思路

  1. 拆解输入元素:将每个输入项(无论是单元素如"1"还是多元素组合如"12")转换成有序的原始字符集合,确保后续组合的有序性。
  2. 筛选无重复组合:在生成目标大小的组合时,检查选中的输入项对应的原始元素是否存在重叠,确保最终子集的原始元素完全唯一。
  3. 有序拼接结果:将筛选后的原始元素按升序排列并拼接成字符串,保证输出格式统一。

完整代码实现

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:21:22