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

Rya*_*hel 10 c# algorithm alphabetical

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

例如,

aaa .. aaz .. aba .. abz .. aca .. acz .. azz .. baa .. baz .. bba .. bbz .. zzz
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢阅读.

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

private IEnumerable<string> 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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Mag*_*nus 30

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

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);
Run Code Online (Sandbox Code Playgroud)

  • @JasonHeddle - `ForEach`方法特定于List <T>.这个_foreach_有什么问题? (2认同)

L.B*_*L.B 14

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);
}
Run Code Online (Sandbox Code Playgroud)

_ _EDIT_ _

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

int N = 4;
var result = Enumerable.Range(0, N).Select(_ => alphabet).CartesianProduct();
foreach (var item in result)
{
    Console.WriteLine(String.Join("",item));
}
Run Code Online (Sandbox Code Playgroud)
// 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<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences)
{
    // base case: 
    IEnumerable<IEnumerable<T>> result = new[] { Enumerable.Empty<T>() };
    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;
}
Run Code Online (Sandbox Code Playgroud)

  • 我想到了类似的东西,但如果我有可变数量的字母组合怎么办?我只用3作为例子.可能需要4或5 (2认同)

Car*_*rra 5

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

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);
Run Code Online (Sandbox Code Playgroud)