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

如何用C#生成指定长度字符集的所有组合与排列?

简洁的C#实现:生成指定长度范围内的字符可重复排列

针对你需要用字符集(如"ab")生成从长度1到指定最大长度的所有可重复排列的需求,这里提供几种简洁的实现方式:

方式一:LINQ递归实现(可读性与简洁性兼顾)

using System;
using System.Collections.Generic;
using System.Linq;

public class Program
{
    public static IEnumerable<string> GenerateCombinations(string chars, int maxLength)
    {
        // 遍历1到maxLength的所有长度,合并所有结果
        return Enumerable.Range(1, maxLength)
                         .SelectMany(length => GenerateLengthCombinations(chars, length));
    }

    private static IEnumerable<string> GenerateLengthCombinations(string chars, int length)
    {
        if (length == 1)
            return chars.Select(c => c.ToString());
        
        // 基于前一个长度的结果,拼接每个字符生成当前长度的排列
        return GenerateLengthCombinations(chars, length - 1)
                .SelectMany(prefix => chars.Select(c => prefix + c));
    }

    public static void Main()
    {
        // 测试:字符集"ab",最大长度3
        foreach (var combo in GenerateCombinations("ab", 3))
        {
            Console.WriteLine(combo);
        }
    }
}

方式二:超紧凑的内联递归写法

如果追求代码行数更少,可以把逻辑内联到Main方法里:

using System;
using System.Linq;

public class Program
{
    public static void Main()
    {
        var chars = "ab";
        var maxLength = 3;
        
        Enumerable.Range(1, maxLength)
                  .SelectMany(n => n == 1 ? chars.Select(c => c.ToString()) 
                                          : Generate(n - 1).SelectMany(p => chars.Select(c => p + c)))
                  .ToList()
                  .ForEach(Console.WriteLine);

        // 局部递归方法
        IEnumerable<string> Generate(int length) => 
            length == 1 ? chars.Select(c => c.ToString()) 
                        : Generate(length - 1).SelectMany(p => chars.Select(c => p + c));
    }
}

方式三:迭代实现(无递归,适合大长度场景)

如果担心递归深度限制(比如maxLength很大),可以用迭代方式逐步构建:

using System;
using System.Collections.Generic;

public class Program
{
    public static IEnumerable<string> GenerateCombinations(string chars, int maxLength)
    {
        var currentCombos = new List<string>();
        
        // 先处理长度1的情况
        foreach (char c in chars)
        {
            var str = c.ToString();
            currentCombos.Add(str);
            yield return str;
        }
        
        // 从长度2开始,逐步生成更长的组合
        for (int length = 2; length <= maxLength; length++)
        {
            var nextCombos = new List<string>();
            foreach (var prefix in currentCombos)
            {
                foreach (char c in chars)
                {
                    var combo = prefix + c;
                    nextCombos.Add(combo);
                    yield return combo;
                }
            }
            currentCombos = nextCombos;
        }
    }

    public static void Main()
    {
        foreach (var combo in GenerateCombinations("ab", 3))
        {
            Console.WriteLine(combo);
        }
    }
}

以上三种方式都能输出你需要的结果:a, b, aa, ab, ba, bb, aaa, aab, aba, abb, baa, bab, bba, bbb。

内容的提问来源于stack exchange,提问作者HopeCube

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:43:18