Найти все возможные перестановки в определенном диапазоне С#

Я хочу создать программу для поиска всех действительных символов акций из Yahoo Finance, и я уже нашел это: Самый быстрый способ перечисления алфавита Однако я не хочу, чтобы он шел от A до Z, затем от AA до AZ, затем от ABA до ABZ и так далее и тому подобное. Как лучше всего это сделать? Более наглядный пример: A B C D ect. AA AB AC AD и т. д. ABA ABB ABC ABD и т. д.


person Alerik    schedule 30.09.2015    source источник
comment
Взгляните на это   -  person Yacoub Massad    schedule 01.10.2015


Ответы (2)


Используя Эрика Липперта Декартово произведение,

var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int maxlen = 3;

var query = Enumerable.Range(1, maxlen)
            .SelectMany(i => Enumerable.Repeat(chars, i)
                             .CartesianProduct()
                             .Select(x => String.Concat(x)));


foreach(var str in query)
{
    Console.WriteLine(str);
}

PS: Просто для полноты:

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;
}

person Eser    schedule 30.09.2015

Не уверен, насколько это быстро, но я сделал следующее, когда мне нужно было сделать что-то подобное:

        for (int i = 0; i < numCols && i < 26; i++)
        {
            char start = 'A';
            char colChar = (char)(start + (char)(i));
            Console.WriteLine(string.Format("{0}", colChar), typeof(string));
        }
        for (int i = 26; i < 52 && i < numCols; i++)
        {
            char start = 'A';
            char colChar = (char)(start + (char)(i-26));
            Console.WriteLine(string.Format("A{0}", colChar), typeof(string));
        }

второй цикл for, очевидно, возвращает только от AA до AZ, но если вы поместите это в функцию, сделаете первую A в качестве входных данных, тогда вы можете пройти через AZ для первого символа, и у вас есть все результаты двух символов. Создание третьей функции с вводом двух символов в качестве предшествующей строки даст вам набор из трех символов.

26 * 26 * 26 - это много, но приведенный выше шаблон должен получить его для вас.

person Owen Ivory    schedule 30.09.2015