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