2016-03-30 5 views
0

Für mein Problem habe ich eine Liste mit einer Zählung größer als 6+. Aus dieser Liste möchte ich eine Liste erstellen, die jede mögliche Kombination der Originalkarten enthält, die genau 6 Karten lang ist. (Sie müssen eindeutig sein und Reihenfolge spielt keine Rolle)Wie bekommt man alle einzigartigen Positionen aus einer Liste?

so 01,02,03,04,05,06 Objekt ist für mich wie 06,05,04,03,02,01

//STARTER list with more then 6 value's 
List <ClassicCard> lowCardsToRemove = FrenchTarotUtil.checkCountLowCardForDiscardChien(handCards); 

Die Lösung fand ich und verwendet:

public static List generateAllSubsetCombinations (object [] Fullset, ulong subsetSize) { if (Fullset == null) { throw new Argument ("Wert kann nicht sein null. "," fullSet "); } sonst if (subsetSize < 1) { neue ArgumentException werfen ("Subset-Größe muss 1 oder größer sein.", "SubsetSize"); } } if ((ulong) fullSet.LongLength < subsetSize) { Neue ArgumentException auslösen ("Die Subset-Größe darf nicht größer sein als die Gesamtzahl der Einträge im gesamten Set.", "SubsetSize"); }

// All possible subsets will be stored here 
    List<object[]> allSubsets = new List<object[]>(); 

    // Initialize current pick; will always be the leftmost consecutive x where x is subset size 
    ulong[] currentPick = new ulong[subsetSize]; 
    for (ulong i = 0; i < subsetSize; i++) { 
     currentPick[i] = i; 
    } 

    while (true) { 
     // Add this subset's values to list of all subsets based on current pick 
     object[] subset = new object[subsetSize]; 
     for (ulong i = 0; i < subsetSize; i++) { 
      subset[i] = fullSet[currentPick[i]]; 
     } 
     allSubsets.Add(subset); 

     if (currentPick[0] + subsetSize >= (ulong)fullSet.LongLength) { 
      // Last pick must have been the final 3; end of subset generation 
      break; 
     } 

     // Update current pick for next subset 
     ulong shiftAfter = (ulong)currentPick.LongLength - 1; 
     bool loop; 
     do { 
      loop = false; 

      // Move current picker right 
      currentPick[shiftAfter]++; 

      // If we've gotten to the end of the full set, move left one picker 
      if (currentPick[shiftAfter] > (ulong)fullSet.LongLength - (subsetSize - shiftAfter)) { 
       if (shiftAfter > 0) { 
        shiftAfter--; 
        loop = true; 
       } 
      } 
      else { 
       // Update pickers to be consecutive 
       for (ulong i = shiftAfter+1; i < (ulong)currentPick.LongLength; i++) { 
        currentPick[i] = currentPick[i-1] + 1; 
       } 
      } 
     } while (loop); 
    } 

    return allSubsets; 
} 
+2

Siehe http://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n –

+0

So findet man alle Kombinationen von 'k erzeugen wollen 'Werte von' n' Werten? Wie 'n' wählen Sie' k' oder 'nCk' in der Statistik? –

+0

Ich möchte jede eindeutige Kombination von "k" Objekten aus "n" Werten, wobei lengt n variabel ist und wo k lengt ist immer 6. – schadowfax

Antwort

0

Dies ist nicht von mir, aber es macht den Job!

List <ClassicCard> lowCardsToRemove = FrenchTarotUtil.checkCountLowCardForDiscardChien(handCards); 
var result = Combinator.Combinations(lowCardsToRemove, 6); 

public static class Combinator 
{ 
    public static IEnumerable<IEnumerable<T>> Combinations<T>(this IEnumerable<T> elements, int k) 
    { 
     return k == 0 ? new[] { new T[0] } : 
      elements.SelectMany((e, i) => 
      elements.Skip(i + 1).Combinations(k - 1).Select(c => (new[] { e }).Concat(c))); 
    } 
} 
+0

Es ist möglich, dass dies funktionieren würde, aber ich habe es nicht getestet. Weil ich gerne einen Check machen würde, wenn ich eine mögliche Untermenge bekomme. Aber danke für die Eingabe Ich fand eine Lösung, und ich poste es unternetnet dies für andere Leute, wenn sie für so etwas eines Tages suchen würden – schadowfax

Verwandte Themen