2013-05-30 28 views

回答

4

这里有一种方法,使用LINQ:

var m = (int)Math.Ceiling(input.Count()/2d); // two columns 
var sorted = input.Select((x, i) => new { x, i }) 
        .OrderBy(p => p.i % m) 
        .Select(p => p.x); 

这可以相当容易地推广到任意数量的列。如果你愿意,它可以很容易地变成一个扩展方法:

public static IEnumerable<T> Columns<T>(this IEnumerable<T> input, int cols) 
{ 
    if (cols < 1) 
    { 
     throw new ArgumentOutOfRangeException(...); 
    } 

    var m = (int)Math.Ceiling(input.Count()/(double)cols); 
    return input.Select((x, i) => new { x, i }) 
       .OrderBy(p => p.i % m) 
       .Select(p => p.x); 
} 

// Usage 
var input = new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; 
var sorted = input.Columns(2); // { 1, 6, 2, 7, 3, 8, 4, 9, 5, 10 } 
+0

这是什么魔术?大声笑。很好,让我试试看。 – rball

+0

+1不错的解决方案。 – I4V

+0

很好的解决方案.. + 1 – ridoy

1

这将很容易地覆盖两列。

public static IEnumerable<T> UseTwoColumns<T>(List<T> list) 
{ 
    int halfway = list.Count/2; 
    for (int i = 0; i < halfway; i++) 
    { 
     yield return list[i]; 
     yield return list[halfway + i]; 
    } 
    if (list.Count % 2 != 0) 
     yield return list[list.Count - 1]; 
} 

如果你想把它推广到路过的列数作为参数,它会是一个稍微更复杂:

public static IEnumerable<T> UseColumns<T>(List<T> list, int columns) 
{ 
    int columnHeight = list.Count/columns; 
    for (int i = 0; i < columnHeight + 1; i++) 
    { 
     for (int j = 0; j < columns; j++) 
     { 
      int index = i + columnHeight * j; 
      if (index < list.Count) 
       yield return list[index]; 
     } 
    } 
} 
+0

是啊,这将是很有帮助。现在我有时会有4次和其他5次。好开始虽然:) – rball

+0

这是我开始走下去的路线,虽然你比我快得多(我有一段时间循环:) p.s.w.g只是让我学到更多东西。 – rball