2012-07-26 38 views
0

可能重复:
Split List into Sublists with LINQ如何使用LINQ将其拆分为子列表?

我正在寻找某种方式可枚举拆分为使用LINQ,使得在输入每个连续的产品在未来的子表3个可枚举按顺序排列。所以输入

{"a", "b", "c", "d", "e", "f", "g", "h"} 

会导致

{"a", "d", "g"}, {"b", "e", "h"}, {"c", "f"} 

我已经做到了这样,但我敢肯定,必须有这种表达更优雅使用LINQ的方式。

var input = new List<string> {"a", "b", "c", "d", "e", "f", "g", "h"}; 
var list = new List<string>[3]; 

for (int i = 0; i < list.Length; i++) 
    list[i] = new List<string>(); 

int column = 0; 
foreach (string letter in input) 
{ 
    list[column++].Add(letter); 
    if (column > 2) column = 0; 
} 
+1

http://stackoverflow.com/questions/419019/split-list-into-sublists-with-linq – 2012-07-26 13:29:56

+0

检查此链接,http://peshir.blogspot.nl/2011/02/example- of-c-lazy-functional.html – Maarten 2012-07-26 13:42:19

+0

请不要编辑自动输入的重复问题链接。它是自动化的,如果问题重新打开,系统将无法删除它。而是在自动插入的明确标记的指示符下进行更改。 – BinaryMisfit 2012-07-27 11:35:20

回答

4

这是你在找什么:(按列拆分) 基于以前的职位

的主要区别是在group by,使用MOD而不是分裂修改。

此外,我做了它的通用,所以它给你回适当的类型(而不是“对象类型”代码)。您可以使用泛型进行类型推断。

public static IEnumerable<IEnumerable<T>> SplitColumn<T>(IEnumerable<T> source) { 
    return source 
     .Select((x, i) => new { Index = i, Value = x }) 
     .GroupBy(x => x.Index % 3) 
     .Select(x => x.Select(v => v.Value).ToList()) 
     .ToList(); 
} 
+0

我确实看到了这个问题,但它要求每个子列表都是连续的,所以我忽略了它。奇怪的是,当它正确地解决了我的问题时,这是被接受的答案,而不是那个问题。 – 2012-07-26 13:46:51

+0

@SteveCrane我只是想,如果我可以使这一点更可重用。你通常如何指定分割大小? (每个子列表的项目或子列表的数量?) – James 2012-07-26 13:49:50

+0

如果您希望这是一个可重用的函数,那么子列表(列)的数量就是您想要的。 – 2012-07-26 14:55:03