2017-10-04 66 views
1

的名單,我有以下的產品清單。拆分列表分爲水平分組的子清單

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

我需要以下的輸出:

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

經過一番研究,我「想出了」用如下:

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; 
     } 
    } 

這個工程,但垂直分佈的項目,我需要水平分散。

想法?謝謝!

===== UPDATE ====

在情況下在源計數不受零件均勻地劃分,這樣的結果必須是像這樣:

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

當源中的計數沒有被部分均分時,會發生什麼?哪個列表應該有額外的部分?或者該項目是否應該從結果列表中截斷? – maccettura

+0

好問題。查看更新:-) – Corstiaan

回答

3

會將該

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(); 
    } 
} 

工作?