2009-08-17 25 views
16

Giả sử tôi cóLàm cách nào để nhóm các mục theo chỉ mục? C# LINQ

var input = new int[] { 0, 1, 2, 3, 4, 5 }; 

Làm thế nào để chúng được nhóm lại thành từng cặp?

var output = new int[][] { new int[] { 0, 1 }, new int[] { 2, 3 }, new int[] { 4, 5 } }; 

Tốt sử dụng LINQ

+0

dụ của bạn không hiển thị như thế nào 0,1 có liên quan để họ có thể được nhóm lại. Hay bạn chỉ nhóm chúng theo tuần tự theo cặp? – JustLoren

+0

Tôi muốn nhóm theo tuần tự theo cặp –

Trả lời

26
input 
    .Select((value, index) => new { PairNum = index/2, value }) 
    .GroupBy(pair => pair.PairNum) 
    .Select(grp => grp.Select(g => g.value).ToArray()) 
    .ToArray() 
0
var indexedNumbers = input.Select((number, index) => new { Index = index, Number = number }); 

var pairs = 
    from indexedNumber in indexedNumbers 
    group indexedNumber by indexedNumber.Index/2 into indexedNumberPair 
    select indexedNumberPair.Select(indexedNumber => indexedNumber.Number); 

var arrays = pairs.Select(pair => pair.ToArray()).ToArray(); 
3

Có lẽ không áp dụng đối với bạn, nhưng bạn có thể sử dụng phương pháp Zip mới trong C# 4,0


var input = new int[] { 0, 1, 2, 3, 4, 5 }; 
IEnumerable evens = input.Where((element, index) => index % 2 == 0); 
IEnumerable odds = input.Where((element, index) => index % 2 == 1); 
var results = evens.Zip(odds, (e, o) => new[] { e, o }).ToArray(); 
 
3
var input = new int[] { 0, 1, 2, 3, 4, 5 }; 
int i = 0; 
var output = input.GroupBy(item => i++/2); 
+0

Theo tôi, đây là một cách giải pháp sạch hơn, so sánh với giải pháp được chấp nhận, mặc dù được chấp nhận phù hợp hơn với LINQ. –

0

Sử dụng ToLookup phương pháp :

input 
    .Select((number, index) => new { index , number}) 
    .ToLookup(_ => _.index/2, _ => _.number) 
    .Select(_ => _.ToArray()) 
    .ToArray(); 

Sử dụng Zip phương pháp:

input 
    .Zip(input.Skip(1), (_, __) => new[] {_, __}) 
    .Where((_, index) => index % 2 == 0) 
    .ToArray(); 
Các vấn đề liên quan