Générer toutes les combinaisons pour une liste de chaînes de caractères
Je veux générer une liste de toutes les combinaisons possibles d'une liste de chaînes de caractères (c'est en fait une liste d'objets, mais pour des raisons de simplicité, nous allons utiliser des chaînes de caractères). J'ai besoin de cette liste afin que je puisse le tester toutes les combinaisons possibles dans un test unitaire.
Donc par exemple si j'ai une liste de:
var allValues = new List<string>() { "A1", "A2", "A3", "B1", "B2", "C1" }
J'ai besoin d'un List<List<string>>
avec toutes les combinaisons comme:
A1
A2
A3
B1
B2
C1
A1 A2
A1 A2 A3
A1 A2 A3 B1
A1 A2 A3 B1 B2
A1 A2 A3 B1 B2 C1
A1 A3
A1 A3 B1
etc...
Une fonction récursive est probablement la façon de faire pour obtenir toutes les combinaisons, mais il semble plus difficile que je l'imaginais.
Les pointeurs?
Merci.
EDIT: deux solutions, avec ou sans récursivité:
public class CombinationGenerator<T>
{
public IEnumerable<List<T>> ProduceWithRecursion(List<T> allValues)
{
for (var i = 0; i < (1 << allValues.Count); i++)
{
yield return ConstructSetFromBits(i).Select(n => allValues[n]).ToList();
}
}
private IEnumerable<int> ConstructSetFromBits(int i)
{
var n = 0;
for (; i != 0; i /= 2)
{
if ((i & 1) != 0) yield return n;
n++;
}
}
public List<List<T>> ProduceWithoutRecursion(List<T> allValues)
{
var collection = new List<List<T>>();
for (int counter = 0; counter < (1 << allValues.Count); ++counter)
{
List<T> combination = new List<T>();
for (int i = 0; i < allValues.Count; ++i)
{
if ((counter & (1 << i)) == 0)
combination.Add(allValues[i]);
}
//do something with combination
collection.Add(combination);
}
return collection;
}
}
Je sais que ce n'est pas tout à fait ce que vous recherchez, mais Microsoft a ce système en version bêta qui va automatiquement générer les entrées de combinaisons pour vous. Il est appelé Pex: research.microsoft.com/en-us/projects/pex
A1 A2 == A2 A1 ?
Imaginez un compteur binaire. Cela devrait vous aider à démarrer.
A1 A2 == A2 A1, en effet
Vous n'avez pas besoin de récursivité: stackoverflow.com/questions/10331229/...
A1 A2 == A2 A1 ?
Imaginez un compteur binaire. Cela devrait vous aider à démarrer.
A1 A2 == A2 A1, en effet
Vous n'avez pas besoin de récursivité: stackoverflow.com/questions/10331229/...
OriginalL'auteur L-Four | 2012-05-09
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire manuellement, en utilisant le fait que n bits du nombre binaire naturellement correspond à un sous-ensemble de n éléments ensemble.
ensuite, vous devez omettre de chaîne.Rejoindre 🙂 Juste mis à jour.
OriginalL'auteur Vlad
Si vous voulez toutes les variantes, ont un coup d'oeil à ce projet de voir comment il est mis en œuvre.
http://www.codeproject.com/Articles/26050/Permutations-Combinations-and-Variations-using-C-G
Mais vous pouvez l'utiliser car il est open source sous CPOL.
Par exemple:
OriginalL'auteur Rango
Similaire de type de tâche est réalisée dans le ci-dessous post:
Liste de toutes les permutations d'un string/integer
Espérons que cette aide.
Aussi, la réponse que vous avez accédé à l'est de la génération permutations, ne sont pas la même chose combinaisons.
OriginalL'auteur Pratik
Encore une solution récursive. De
AllCombinations
dans le code ci-dessous, vous obtiendrez toutes les combinaisons possibles.Logique:
Code:
OriginalL'auteur Nans