2017-10-04 69 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(); 
    } 
} 

工作?