2016-03-31 15 views
-3

Ich habe eine List<Object>. Ich habe eine int maxSize. Ich möchte eine List<List<Object>>, die alle Kombinationen von Objekten von maxSize enthält (diese Listen sind maxSize, nicht die Objekte) oder weniger.C# - Holen Sie sich alle Kombinationen von definierter Länge (oder weniger) aus einer Liste von Objekten

Ich habe Lösungen für Probleme gesehen, die wie mein Problem aussehen, außer sie sind nicht mein Problem und offensichtlich ist mein Gehirn nicht schlau genug, um es herauszufinden. Ich habe auch schon 3 Tage mit meinem Gesamtproblem verbracht, um mich selbst in Vergessenheit zu bringen, also suche ich nur nach Lösungen, die genau an diesem Punkt funktionieren.

Anforderungen:

  • Es hat eine List<List<Object>>, nichts anderes zurückzukehren.
  • Es muss eine List<Object> und int als Argumente. Wenn es mehr Argumente für Rekursion oder was auch immer benötigt, ist es in Ordnung. Die ersten beiden Argumente sind immer noch ein List<Object> und ein Int, nichts anderes.
  • Jede List<Object> kann nur von maxSize oder weniger sein. Die Anforderung "oder weniger" ist optional, ich kann ohne sie arbeiten.
  • Reihenfolge spielt keine Rolle. {1,2} entspricht {2,1}.
  • Duplikate sind nicht erlaubt. Wenn es {1,2} enthält, kann es {2,1} nicht enthalten.
+2

Verwenden Sie HTML nicht zum Formatieren Ihres Codes. Es ist sehr schwierig, es dann neu zu formatieren. Verwenden Sie die integrierten Editor-Funktionen, insbesondere die 'code'-Schaltfläche, nachdem Sie den zu formatierenden Text ausgewählt haben. –

+0

Was hält Sie davon ab, die C# -Antwort in [die oben verwandte Frage] (http://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-von-k-elements-from-n? Rq = 1) in einer Schleife von 1 bis maxSize? – Martheen

+0

Weil es keine Liste von Listen zurückgibt und ich die Hälfte dessen, was es tut, nicht verstehe, kann ich nicht herausfinden, wie ich es anpassen soll. – AmiralPatate

Antwort

1

Hier ist eine leichte Modifikation auf meine Antwort auf diese Frage:
Clean algorithm to generate all sets of the kind (0) to (0,1,2,3,4,5,6,7,8,9)

static IEnumerable<List<T>> Subsets<T>(List<T> objects, int maxLength) { 
    if (objects == null || maxLength <= 0) 
     yield break; 
    var stack = new Stack<int>(maxLength); 
    int i = 0; 
    while (stack.Count > 0 || i < objects.Count) { 
     if (i < objects.Count) { 
      if (stack.Count == maxLength) 
       i = stack.Pop() + 1; 
      stack.Push(i++); 
      yield return (from index in stack.Reverse() 
          select objects[index]).ToList(); 
     } else { 
      i = stack.Pop() + 1; 
      if (stack.Count > 0) 
       i = stack.Pop() + 1; 
     } 
    } 
} 

Anwendungsbeispiel:

var numbers = new List<int>{1,2,3,4,5}; 
foreach (var subset in Subsets(numbers, 3)) { 
    Console.WriteLine(string.Join("", subset)); 
} 

Wenn Sie eine List<List<int>> benötigen, rufen Sie einfach ToList() auf das Ergebnis .

+0

Jetzt kochen wir, danke. – AmiralPatate

Verwandte Themen