Algorytm generowania k-elementowych kombinacji string bez powtórzeń

0

Posiadam dwuwymiarową tablicę string i chcę z niej tworzyć k-elementowe kombinacje bez powtórzeń (gwoli ścisłości: nie chodzi mi o permutacje; przy kombinacjach {"ala","kot"} i {"kot,"ala"} to jedno i to samo), zapisując je do nowej listy. Głowię się nad tym od dłuższego czasu i postanowiłem poprosić o pomoc. Będę niezmiernie wdzięczny za podsunięcie mi odpowiedniego algorytmu, gotowej metody lub choćby drobnej podpowiedzi :)
Pozdrawiam!

1
public static class IEnumerableExtensions
    {
        public static IEnumerable<T[]> GetPermutations<T>(T[,] values)
        {
            var buffer = new List<T[]>();

            for (int i = 0; i < values.GetLength(0); i++)
            {
                for (int j = 0; j < values.GetLength(1); j++)
                {
                    if (buffer.Any(z => z.First().Equals(values[i,j]))) continue;
                    for (int k = i; k < values.GetLength(0); k++)
                    {
                        for (int z = j; z < values.GetLength(1); z++)
                        {
                            if (values[i, j].Equals(values[k, z])) continue;
                            buffer.Add(new T[] { values[i, j], values[k, z] });
                        }
                    }
                }
            }

            return buffer;
        }
    }

Wykorzystanie:

var input = new string[2, 2];
input[0, 0] = "ala";
input[0, 1] = "ma";
input[1, 0] = "kota";
input[1, 1] = "foo";

var permutations = IEnumerableExtensions.GetPermutations(input);

Wynik:

ala ma
ala kota
ala foo
ma kota
ma foo
kota foo

1 użytkowników online, w tym zalogowanych: 0, gości: 1