2016-06-13 33 views
1

Dies ist eine Frage aus einem früheren Post. Nachdem ich meine frühere Frage geklärt hatte, wurde mir empfohlen, einen neuen Posten zu machen, da sich die Frage dramatisch verändert hatte, was ein guter Vorschlag war. Hier ist die ursprüngliche Frage: Why doesn't this LINQ Select expression workErstellen einer Liste, Abrufen eines Elements aus jeder verschachtelten Liste

Die aktualisierte Frage lautet wie folgt. Was ich will, ist jede Permutation zu bekommen, wobei jede neue Gruppe nur aus einem Element einer Liste von Listen besteht. Als Beispiel:

List<List<int>> oldList = {{1,2},{3,4}}; 
List<List<int>> newList = {{1,3},{1,4},{2,3},{2,4}}; 

Ich bin auf der Suche nach einer Möglichkeit, oldList in newList zu konvertieren. Die Herausforderung besteht darin, dass ich nicht weiß, wie viele verschachtelte Listen es gibt oder wie viele Artikel in jeder Liste sein werden. Sie können davon ausgehen, dass jede verschachtelte Liste die gleiche Länge hat. Irgendwelche Ideen? Danke für jede Hilfe.

Antwort

1

Sie können über this Beitrag von Eric Lippert über die Berechnung eines kartesischen Produkts mit LINQ lesen.

Die Idee ist, jede Liste zu besuchen und ein kartesisches Produkt dieser Liste mit dem aktuellen kartesischen Produktset zu erstellen. Diese

ist der Code:

static IEnumerable<IEnumerable<T>> CartesianProduct<T>(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 })); 
} 

Verbrauch:

var newList = CartesianProduct(oldList); 
+0

Dank! Ich habe vor dem Programmieren nicht angehalten, um zu erkennen, dass ich das kartesische Produkt brauchte, ich werde meinen Kopf in Schande hängen, lol! – michaelto20

Verwandte Themen