Объединить элементы в список <T>за предварительно определенный заказ - PullRequest
0 голосов
/ 09 января 2020

Мой реальный вариант использования более сложный и включает в себя класс, а не строку, но если я смогу решить упрощенный пример, я смогу использовать его обратно. Однако я не могу использовать решение, которое основано на идентификации букв или чего-то подобного.

private void Example()
{
    var permutations = new List<List<int>>
    {
        new List<int> { 0, 1, 2 }, // AB + C + D, ABC + D, ABCD
        new List<int> { 0, 2, 1 }, // AB + C + D, AB + CD, ABCD
        new List<int> { 1, 0, 2 }, // A + BC + D, ABC + D, ABCD
        new List<int> { 1, 2, 0 }, // A + BC + D, A + BCD, ABCD
        new List<int> { 2, 0, 1 }, // A + B + CD, AB + CD, ABCD
        new List<int> { 2, 1, 0 }  // A + B + CD, A + BCD, ABCD
    };

    foreach (var permutation in permutations)
    {
        var variables = new List<string> { "A", "B", "C", "D" };
        int count = 0;

        foreach (var i in permutation)
        {
            variables[i - count] = variables[i - count] + variables[i - count + 1];
            variables.RemoveAt(i - count + 1);
            count++;
        }

        Console.WriteLine(variables.Single());
    }
}

Как показано, я пытаюсь объединить элементы в списке в предопределенном порядке, предоставленном permutations. Приведенный пример работает для первой перестановки, но не для второй, так как индекс становится отрицательным.

Я сделал несколько снимков в темноте, и хотя сам по себе знаю, какую операцию необходимо выполнить, я не могу обернуть моя голова вокруг, как программировать это.

// Fails on { 1, 0, 2}
if (i - count == 0)
    count++;

// Fails on { 1, 0, 2}
if (i - count + 1 < variables.Count)
    count++;

1 Ответ

1 голос
/ 09 января 2020

Пара вещей, которые вам нужно сделать.

  1. index никогда не может быть меньше 0 или больше, чем размер списка.
  2. увеличивать счет только если i меньше, чем размер перестановки (3).

Решение

    var answers = new List<string>();

    foreach (var permutation in permutations)
    {
        var original = new List<string> { "A", "B", "C", "D" };
        var variables = original.ToList();
        var perm = new List<string>();
        int count = 0;
        foreach (var i in permutation)
        {
            int index = i - count < 0 ? 0 : i - count;
            variables[index] = variables[index] + variables[index + 1];
            variables.RemoveAt(index + 1);

            if (i < permutation.Count - 1) 
                count++;

            perm.Add(string.Join(" + ", variables));
        }
        answers.Add(string.Join(",", perm));
    }

Выход

ответы содержат список всех перестановок.

answers
Count = 6
    [0]: "AB + C + D,ABC + D,ABCD"
    [1]: "AB + C + D,AB + CD,ABCD"
    [2]: "A + BC + D,ABC + D,ABCD"
    [3]: "A + BC + D,A + BCD,ABCD"
    [4]: "A + B + CD,AB + CD,ABCD"
    [5]: "A + B + CD,A + BCD,ABCD"

Вы можете объединить и создать один элемент, но это должно привести вас туда, где вам нужно.

...