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!
0
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