2017-10-04 5 views
1

Ich habe die folgende Liste der Objekte:Split-Liste in die Liste von horizontal gruppiert Unterlisten

List: [Item 1, Item 2, Item 3, Item 4, Item 5, Item 6, Item 7, Item 8, Item 9] 

ich die folgende Ausgabe benötigen:

List 1: [Item 1, Item 4, Item 7] 
List 2: [Item 2, Item 5, Item 8] 
List 3: [Item 3, Item 6, Item 9] 

Nach einigen Recherchen I „kam“ mit dem folgende:

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int parts) 
    { 
     var list = new List<T>(source); 
     int defaultSize = (int)((double)list.Count/(double)parts); 
     int offset = list.Count % parts; 
     int position = 0; 

     for (int i = 0; i < parts; i++) 
     { 
      int size = defaultSize; 
      if (i < offset) 
       size++; 

      yield return list.GetRange(position, size); 

      position += size; 
     } 
    } 

Das funktioniert aber verteilt die Artikel vertikal und ich brauche die Ausbreitung horizontal.

Dachte? Vielen Dank!

===== ==== UPDATE

Falls die Zählung in der Quelle nicht gleichmäßig durch Teile geteilt wird, dieses Ergebnis wie so sein muss:

List 1: [Item 1, Item 5, Item 9] 
List 2: [Item 2, Item 6, Item 10] 
List 3: [Item 3, Item 7] 
List 4: [Item 4, Item 8] 
+0

Was passiert, wenn die Anzahl in der Quelle nicht gleichmäßig durch Teile geteilt wird? Welche Liste sollte das Extra Stück haben? Oder sollte dieses Element nur von den resultierenden Listen abgeschnitten werden? – maccettura

+0

Gute Frage. Siehe Aktualisierung :-) – Corstiaan

Antwort

3

Würde das

public static IEnumerable<IEnumerable<T>> Split<T>(this IEnumerable<T> source, int parts) 
{ 
    var list = new List<T>(source);  
    foreach (var group in list.GroupBy(x => list.IndexOf(x) % parts)) 
    { 
     yield return group.ToList(); 
    } 
} 

arbeiten?

Verwandte Themen