C # Permutation d'un tableau d'arraylists?
J'ai une liste de tableaux[] myList et je suis en train de créer une liste de toutes les permutations des valeurs dans les tableaux de.
EXEMPLE: (toutes les valeurs sont des chaînes de caractères)
myList[0] = { "1", "5", "3", "9" };
myList[1] = { "2", "3" };
myList[2] = { "93" };
Le comte de myList peuvent être modifiés de telle sorte que sa longueur n'est pas connue à l'avance.
Je voudrais être en mesure de générer une liste de toutes les permutations semblable à la suivante (mais avec des supplémentaires de mise en forme).
1 2 93
1 3 93
5 2 93
5 3 93
3 2 93
3 3 93
9 2 93
9 3 93
Est-il logique de ce que je suis en train d'accomplir? Je n'arrive pas à trouver une bonne méthode pour faire cela, (le cas échéant).
Edit:
Je ne suis pas sûr si la récursivité pourrait interférer avec mon désir pour le format de sortie dans ma propre façon. Désolé, je n'ai pas mentionné avant que ma mise en forme a été.
J'ai envie de finir la construction d'un string[] tableau de toutes les combinaisons qui suit le format comme ci-dessous:
pour le "1 2 93" permutation
Je veux que la sortie de la "val0=1;val1=2;val2=93;"
Je vais expérimenter avec la récursivité pour l'instant. Merci DrJokepu
source d'informationauteur | 2009-04-02
Vous devez vous connecter pour publier un commentaire.
Je suis surpris que personne n'a posté le LINQ solution.
Solution récursive
Note qu'il serait assez facile de retourner une liste ou un tableau au lieu d'une chaîne en changeant le retour à une liste de listes de chaînes et de modification de la retval.ajouter un appel à travailler avec une liste au lieu d'utiliser la concaténation.
Comment cela fonctionne:
C'est un classique de l'algorithme récursif. Le cas de base est
foo(myList.Count, myList)
qui renvoie une Liste contenant un élément, la chaîne vide. La permutation d'une liste de n tableaux de chaîne s1, s2, ..., sN est égal pour tous les membres de sA1 précédé de la permutation de n-1 tableaux de chaîne, s2, ..., sN. Le cas de base est juste là pour apporter quelque chose pour chaque élément de sN pour être concaténées.Je suis récemment tombé sur un problème similaire dans un projet de mine et je suis tombé sur cette question. J'avais besoin d'une non-solution récursive qui pourraient travailler avec des listes d'objets arbitraires. Voici ce que j'ai trouvé. Fondamentalement, je suis à la formation d'une liste d'agents recenseurs pour chacune des sous-listes et l'incrémentation eux de manière itérative.
Vous pouvez utiliser factoradics pour générer l'énumération des permutations. Essayez cet article sur MSDN pour une implémentation en C#.
Cela fonctionne, peu importe le nombre de tableaux que vous ajoutez à votre maliste:
Noter que ce n'est pas vraiment récursive. Probablement trompeuse nom de la fonction.
Ici est une version qui adhère à vos nouvelles exigences. Remarque la section où je l'ai sortie de la console, c'est où vous pouvez faire votre propre mise en forme:
Ce que vous demandez est appelé le Produit Cartésien. Une fois que vous savez ce que son nom, il y a plusieurs questions similaires sur un Débordement de Pile. Ils semblent tous à l'extrémité pointant vers une réponse qui s'est terminée par écrit un post de blog:
http://blogs.msdn.com/b/ericlippert/archive/2010/06/28/computing-a-cartesian-product-with-linq.aspx
Non-solution récursive:
Solution récursive:
Ici générique est une fonction récursive que j'ai écrit (et une surcharge qui peut être commode d'appel):
Et l'équivalent en C#:
Facile à utiliser:
ou en C#:
Ici est une version qui utilise très peu de code, et est entièrement déclarative
Voici un non-récursive, non-Linq solution. Je peux pas m'empêcher de penser que je pourrais avoir moins de bouclage et de calculer les positions avec la division et le modulo, mais pas tout à envelopper ma tête autour de cela.
L'un des problèmes que j'ai encountred quand je faisais cela pour une très grande quantité de codes est qu'avec l'exemple de brian a été donné, je l'ai réellement manquer de mémoire. Pour résoudre cela, j'ai utilisé de code suivant.