Просто перебор по алфавиту

405
10 февраля 2017, 01:57

Завис я над таким вопросом, чтобы поставить интервал от и до, типа так:

class Program
{
    static void Main(string[] args)
    {
        string alfavit = "abc";
        for (int a = 0; a < alfavit.Length; a++)
        {
            string start_pos = "cb";
            string end_pos = "cd";
            string main = start_pos + alfavit[a].ToString();
            Console.WriteLine(main);
            if (main == end_pos)
            {
                Console.WriteLine(main);
            }
            main = end_pos + alfavit[a].ToString();
            Console.WriteLine(main);
            if (main == end_pos)
            {
                Console.WriteLine(main);
            }
        }
        Console.ReadKey();
    }
}

}

Как получить так чтобы комп показал вот так на экране: cba cbb cbc cca ccb ccc cda cda cda

Answer 1

Есть много разных способов. Классический способ — установление соответствия между вашей строкой и записью числа в n-ичной системе счисления (для вашего случая n == 3). Я покажу более простой с идеологической точки зрения вариант, который имитирует переход к следующей строке. Для удобства я буду пользоваться массивами символов.

class Alphabet
{
    int size;
    List<char> letters;
    Dictionary<char, int> indices;
    public Alphabet(IEnumerable<char> letters)
    {
        this.letters = letters.ToList();
        this.indices = this.letters.Select((c, idx) => new { c, idx })
                                   .ToDictionary(p => p.c, p => p.idx);
        this.size = this.letters.Count;
    }
    public bool Advance(ref char c)
    {
        var letterPos = indices[c] + 1;
        if (letterPos == size)
            letterPos = 0;
        c = letters[letterPos];
        return letterPos > 0;
    }
    public bool Advance(char[] chars)
    {
        for (int index = chars.Length - 1; index >= 0; index--)
        {
            if (Advance(ref chars[index]))
                return true;
        }
        return false;
    }
}

Имея такой вспомогательный класс, можно делать разные вещи. Например, вывод всех строк:

var abc = new Alphabet("abc");
var chars = "aaa".ToCharArray();
do
{
    Console.WriteLine(new string(chars));
} while (abc.Advance(chars));

Вывод строк от "bac" до "cab":

var chars2 = "bac".ToCharArray();
do
{
    var s = new string(chars2);
    Console.WriteLine(s);
    if (s == "cab")
        break;
} while (abc.Advance(chars2));

и т. д.

READ ALSO
Какой Кросплатформенный GUI лучший на C#?

Какой Кросплатформенный GUI лучший на C#?

Нужен для работы программы на Windows и Linux

287
Метод с параметром &lt;T&gt;

Метод с параметром <T>

Есть необходимость задавать текстовую маску для двух компонентов разных типовКаждый из них эту возможность поддерживает

231
Может ли SSL сертификат блокировать SignalR

Может ли SSL сертификат блокировать SignalR

Проблема заключается в следующем, на стороне клинта, клиент может запустить задачу и она начинает выполняться на стороне сервера, а клиент...

336
Изменить цвет границ ячеек DataGridView

Изменить цвет границ ячеек DataGridView

Есть DataGridViewПодскажите, возможно ли изменить цвет границы всех ячеек? К примеру, сделать зеленым

548