如何获得所有可能的3个字母排列?

可能重复:
列出字符串/整数的所有排列

例如,

aaa .. aaz .. aba .. abz .. aca .. acz .. azz .. baa .. baz .. bba .. bbz .. zzz 

基本上,想象计算二进制,但不是从0到1,它从a到z。

我一直试图让这个工作几个小时现在无济于事,公式变得相当复杂,我不确定是否有更简单的方法来做到这一点。

谢谢阅读。

编辑:我现在有这样的东西,但它不是那里,我不确定是否有更好的方法:

 private IEnumerable GetWordsOfLength(int length) { char letterA = 'a', letterZ = 'z'; StringBuilder currentLetters = new StringBuilder(new string(letterA, length)); StringBuilder endingLetters = new StringBuilder(new string(letterZ, length)); int currentIndex = length - 1; while (currentLetters.ToString() != endingLetters.ToString()) { yield return currentLetters.ToString(); for (int i = length - 1; i > 0; i--) { if (currentLetters[i] == letterZ) { for (int j = i; j < length; j++) { currentLetters[j] = letterA; } if (currentLetters[i - 1] != letterZ) { currentLetters[i - 1]++; } } else { currentLetters[i]++; break; } } } } 

对于可变数量的字母组合,您可以执行以下操作:

 var alphabet = "abcdefghijklmnopqrstuvwxyz"; var q = alphabet.Select(x => x.ToString()); int size = 4; for (int i = 0; i < size - 1; i++) q = q.SelectMany(x => alphabet, (x, y) => x + y); foreach (var item in q) Console.WriteLine(item); 
 var alphabet = "abcdefghijklmnopqrstuvwxyz"; //or var alphabet = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (char)i); var query = from a in alphabet from b in alphabet from c in alphabet select "" + a + b + c; foreach (var item in query) { Console.WriteLine(item); } 

_ _EDIT_ _

对于一般解决方案,您可以在此处使用CartesianProduct

 int N = 4; var result = Enumerable.Range(0, N).Select(_ => alphabet).CartesianProduct(); foreach (var item in result) { Console.WriteLine(String.Join("",item)); } 

 // Eric Lippert's Blog // Computing a Cartesian Product with LINQ // http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx public static IEnumerable> CartesianProduct(this IEnumerable> sequences) { // base case: IEnumerable> result = new[] { Enumerable.Empty() }; foreach (var sequence in sequences) { var s = sequence; // don't close over the loop variable // recursive case: use SelectMany to build the new product out of the old one result = from seq in result from item in s select seq.Concat(new[] { item }); } return result; } 

这是一个非常简单的解决方案:

 for(char first = 'a'; first <= (int)'z'; first++) for(char second = 'a'; second <= (int)'z'; second++) for(char third = 'a'; third <= (int)'z'; third++) Console.WriteLine(first.ToString() + second + third); 

3“数字”你有26 ^ 3计数。 只需在三个循环中从’a’迭代到’z’。