如何用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
相关产品推荐
相关产品推荐

