0
votes

Permutation entre plusieurs tableaux avec des valeurs nulelles

J'essaie de perperger plusieurs tableaux de différentes tailles avec des valeurs nulles. Quelque chose comme: xxx

exemple: xxx

résultat: 81 permutations (3 ^ 4) xxx

J'ai essayé beaucoup de choses mais rien de tout cela n'a fonctionné. La meilleure chose que j'ai trouvée était Cette réponse à partir d'une autre question: xxx

mais cela ne fonctionne pas avec plusieurs listes.

EDIT: L'exemple ci-dessus est Une réponse combinatoire qui a fonctionné pour moi lorsque je travaillais avec un autre problème. Il génère des permutations mais pas toutes et ne fonctionne pas avec plusieurs listes.


7 commentaires

Votre question semble être des permutations, mais votre réponse liée concerne les combinaisons. Donc, l'extraite donne des combinaisons et n'est donc pas utile pour votre problème ... non?


Vous dites que vous voulez des permutations mais votre réponse semble ne pas inclure par exemple. {4, 3, 2, 1} ? Montrez un exemple plus simple où vous pouvez répertorier toute la réponse ...


Que devriez-vous arriver si l'une des listes transmises est une longueur différente?


Je parviens à travailler avec la solution de liaison, c'est pourquoi j'ai posté ici. Mais si vous pensez que c'est déroutant, je peux enlever


@Netmage Je prends l'exemple pour dire qu'ils veulent toutes les combinaisons où le premier élément est le premier élément de l'une des listes, et le second est le deuxième élément de l'une des listes, etc.


@juharrore doit définir NULL s'il ne trouve pas d'élément correspondant à permutate


Si vous modifiez les listes (1,5,9); (2,6,7), (3,7), (4,8,0), ce que vous voulez, c'est le produit cartésien de ces ensembles et voici un bon Blog sur la façon de faire ce ericlippert.com/2010 / 06/28 / ...


3 Réponses :


2
votes

On dirait que vous voulez que le produit cartésien du pivot de ces ensembles. Ainsi, en utilisant la méthode suivante du blog de Eric Lippert sur le fait de faire le Produit cartésien d'ensembles xxx pré>

et ce code pour faire le pivot p> xxx pré>

Vous devez obtenir votre réponse en faisant la réponse Suivant. P>

var list1 = new List<string>() { "1", "2", "3", "4" };
var list2 = new List<string>() { "5", "6", "7", "8" };
var list3 = new List<string>() { "9", "7", null, "0" };

var fullList = new List<List<string>>() { list1, list2, list3 };

var result = CartesianProduct(Pivot(fullList));


1 commentaires

Incroyable, ça a fait l'affaire! Merci. J'ai lu l'Eric Lippert's Blog il y a environ 5 jours lorsque ce problème est arrivé mais ne pouvait pas faire grand chose.



2
votes

Leveraging Produit cartésien par Eric Lippert :

static IEnumerable<IEnumerable<T>> GetAllPermutations<T>(IEnumerable<List<T>> lists)
{
    return lists.SelectMany(l => l.Select((item, index) => (item, index)))
        .GroupBy(c => c.index, c => c.item) // each group will have items allowed on n-th position
        .OrderBy(g => g.Key) // actually not needed in this case, but just to be sure
        .CartesianProduct();
}

public static class Ext
{
    public static IEnumerable<IEnumerable<T>> CartesianProduct<T>
        (this IEnumerable<IEnumerable<T>> sequences)
    {
        IEnumerable<IEnumerable<T>> emptyProduct =
          new[] { Enumerable.Empty<T>() };
        return sequences.Aggregate(
          emptyProduct,
          (accumulator, sequence) =>
            from accseq in accumulator
            from item in sequence
            select accseq.Concat(new[] { item }));
    }
}


4 commentaires

C'est une meilleure façon de faire le pivot.


@juhararr, merci d'être amélioré (aussi besoin de corriger groupeby cause t est la valeur TUPLE (élément, index) ).


Oui, juste un SELECT (GRP => GRP.SELECT (x => x.item)) fonctionnera, le toliste n'est pas nécessaire.


@juharrr, juste sélectionné dans groupby clause =)



0
votes

Utilisation d'une méthode d'extension pour une puissance intégrale, vous pouvez traiter la sortie sous forme de numéro B de base avec n chiffres et calculer la valeur de chaque position de chiffre puis convertir en caractères de l'entrée.

Premièrement, la méthode d'extension d'alimentation intégrale : P>

var numbase = fullList.Count;
var digits = fullList[0].Count;
var alpha = fullList.Select(l => l.ToList()).ToList();
var ans = Enumerable.Range(0, numbase.Pow(digits))
                    .Select(n => Enumerable.Range(0, digits).Select(d => alpha[(n / (numbase.Pow(d))) % numbase][d]));


0 commentaires