Combinaison Générateur de Linq
Est-il possible de créer un peu de Linq qui génère une Liste contenant toutes les combinaisons possibles d'une série de chiffres??
Si vous entrez "21", il serait de générer une liste avec les éléments:
list[0] = "21"
list[1] = "22"
list[2] = "11"
list[3] = "12"
(Pas nessesarily dans cet ordre)
- Je comprendre que vous pouvez utiliser la plage à faire des choses comme:
List<char> letterRange = Enumerable.Range('a', 'z' - 'a' + 1).Select(i => (Char)i).ToList(); //97 - 122 + 1 = 26 letters/iterations
Qui génère de l'alphabet de a-z. Mais je n'arrive pas à transférer ce savoir pour faire une combinaison générateur
J'ai été en mesure de le comprendre avec le code suivant, mais il semble trop encombrant et je suis sûr qu'il peut être fait avec quelques lignes. On ressent vraiment une mauvaise solution que j'ai fait.
Imaginer que j'ai appelé GetAllCombinations("4321")
si elle contribue à
public static String[] GetAllCombinations(String s)
{
var combinations = new string[PossibleCombinations(s.Length)];
int n = PossibleCombinations(s.Length - 1);
for (int i = 0; i < s.Length; i++)
{
String sub;
String[] subs;
if (i == 0)
{
sub = s.Substring(1); //Get the first number
}
else if (i == s.Length - 1)
{
sub = s.Substring(0, s.Length - 1);
}
else
{
sub = s.Substring(0, i) + s.Substring(i + 1);
}
subs = GetAllCombinations(sub);
for (int j = 0; j < subs.Length; j++)
{
combinations[i * n + j] = s[i] + subs[j];
}
}
return combinations;
}
public static int PossibleCombinations(int n) //Combination possibilities. e.g 1-2-3-4 have 24 different combinations
{
int result = 1;
for (int i = 1; i <= n; i++)
result *= i;
return result;
}
Vous devez vous connecter pour publier un commentaire.
Pour ce que ça vaut, essayez quelque chose comme ceci:
{ "12", "21" }
, manquant"11"
et"22"
.) Je ne peux que supposer que le demandeur a réussi à l'adapter à quelque chose d'utile.Pour l'enregistrement: Josh répondre à la façon générique:
items
sont égaux.Voici mon Permutation et Combinaison de la fonction à l'aide de Linq
De l'ADN de l'alphabet 'A', 'C', 'G', 'T':
donne
et les combinaisons (k = 2) de l'ADN de l'alphabet
sont
combinate
est en fait quelque chose d'autre qui est appelé variations.combinate
devrait traiter de " AC " et " CA " comme même chose et donc seul le retour un de ceux. Sauf que j'ai vraiment apprécié l'étude de votre code 🙂Ce que vous cherchez sont en fait des permutations. En bref, les permutations signifie que la commande est pertinent (par exemple, 12 est différent de 21), tandis qu'une combinaison de moyens de commande n'est pas pertinent (12 et 21 sont équivalentes). Pour plus d'informations, voir Wikipedia.
Voir ce fil.
Comme pour le faire est dans le plus pur LINQ, qui sonne comme l'utilisation de LINQ pour le bien de l'utilisation de LINQ.
Comme d'autres l'ont souligné les solutions sur cette page vous permettra de générer des doublons si tout les éléments sont les mêmes. Le Distinct() extension de supprimer, mais il n'est pas très évolutif car il sera généralement l'ensemble de l'arbre de recherche traversée de toute façon. Vous allez découper l'espace de recherche considérablement en l'appelant au cours de la traversée:
Pour l'exemple de la chaîne "bananabana" il en résulte 8,294 nœuds visités, par opposition à la 9,864,101 visité quand vous ne faites pas la traversée de l'abattage.
Vous pouvez utiliser cette Permuter extension LINQ:
Qui résultats dans ce:
Vous pouvez éventuellement spécifier le nombre de permutations
Résultats:
Classe d'Extension pour ajouter: