2012-07-26 65 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