permutación de elementos de matriz

¿Cómo hago para obtener una combinación de una matriz de cadenas de la cuenta 2? Es decir.

List<string> myString = {"a", "b", "c", "d", "f"};

Una permutación se vería así:

ab ac ad af ba bc bd bf ca cb cd cf etc ...

No tengo idea de cómo comenzar este algoritmo. Si ayuda, prefiero hacer un bucle que una recursividad porque en mi implementación real, tengo que asignar un valor a los elementos permutados y comparar cada uno con otro y seleccionar el más alto.

preguntado el 08 de enero de 11 a las 17:01

Por lo general, es mejor poner cosas como "C #" en las etiquetas en lugar de la línea de asunto. -

Gracias, ¿no lo encontrarían mejor los motores de búsqueda porque aparece en una etiqueta de encabezado? -

No me preocuparía demasiado por eso. Los motores de búsqueda indexan TAN bastante bien. Deje que el equipo de SO se preocupe por optimizar eso. :) -

Para ser precisos, no puede usar tal sintaxis para inicializar un List, Utilizar List<string> myString = new List<string> { "a", "b", "c", "d", "f" }; -

4 Respuestas

Usando Linq:

var result = 
    from a in myString
    from b in myString
    where a != b
    select a + b;

Respondido 11 Abr '12, 05:04

No usa LINQ

List<string> myString = {"a", "b", "c", "d", "f"};
List<String> result = new List<String> ();
for (int i = 0; i < myString.Count; i++)
{
    for (int j = 0; j < myString.Count; j++)
    {
        if (i == j)
            continue;
        result.Add(myString[i] + myString[j]);
    }
}

respondido 17 nov., 11:01

segunda for loop should have j++ y no i++ - Alexandros B

Sin LINQ, puede utilizar un bucle anidado:

var permutations = new List<string>();
for(int i = 0; i < myString.Count; i++) 
{
    for(int j = 0; j < myString.Count; j++)
    {
        if(i == j)
            continue;

        var permutation = string.Format("{0}{1}", myString[i], myString[j]);
        permutations.Add(permutation);
    }
}

respondido 16 nov., 11:19

por tener i < myString.Count - 1 haces un bucle para un elemento menos si no me equivoco, o necesitas i <= myString.Count - 1 OR i < myString.Count - Alexandros B

Complementando las respuestas anteriores:

        string[] arreglo = new string[6];
        arreglo[0] = "a";
        arreglo[1] = "b";
        arreglo[2] = "c";
        arreglo[3] = "d";
        arreglo[4] = "e";
        arreglo[5] = "f";

        var permutations = new List<string>();
        for (int i = 0; i < arreglo.Length; i++)
        {
            for (int j = 0; j < arreglo.Length; j++)
            {
                for (int k = 0; k < arreglo.Length; k++)
                {
                    for (int l = 0; l < arreglo.Length; l++)
                    {
                        for (int m = 0; m < arreglo.Length; m++)
                        {
                            for (int n = 0; n < arreglo.Length; n++)
                            {
                                if (i ==j ||j == k||i == k||k == l||i == l||j == l||i == m||j == m||k == m||l == m||i == n||j == n||k == n||l == n||m == n)
                                    continue;

                                var permutation = string.Format("{0}{1}{2}{3}{4}{5}", arreglo[i], arreglo[j], arreglo[k], arreglo[l], arreglo[m],arreglo[n]);
                                permutations.Add(permutation);
                            }
                        }
                    }
                }
            }
        }

        foreach(var element in permutations)
        {
            Console.WriteLine(element);
        }
        Console.ReadLine();

Respondido 20 Oct 16, 09:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.