Список к столбцам в LINQ

Данный IEnumerable<T> и количество строки, я хотел бы преобразовать его в IEnumerable<IEnumerable<T>> как так:

Вход:

Row Count: 3

List: [1,2,3,4,5,6,7]

Вывод

 
[
 [1,4,7]
 [2,5]
 [3,6]
]

РЕДАКТИРОВАНИЕ я хотел бы, чтобы это работало на любой IEnumerable и не зависело от T быть Int32.

Как я могу сделать это использование LINQ?

13
задан Sam Saffron 2 June 2010 в 07:58
поделиться

4 ответа

Это поможет:

var list = new List<object> { 1, "two", 3, 4, 5, 6 ,7 };
int count = 3;
var rows = list.Select((item, index) => new { Item = item, Index = index })
            .GroupBy(o => o.Index % count)
            .Select(g => g.Select(o => o.Item));

Это должно работать для любого Enumerable

16
ответ дан 1 December 2019 в 23:14
поделиться
var src = new List<int> { 2, 4, 8, 16, 23, 42, 101 };
var i = 0;
var answer = src.GroupBy(item => i++ % 3)
                .Select(item => item.ToArray())
                .ToArray();

хе-хе, и с помощью этого трюка мы можно избежать временной переменной, но код станет нечитаемым:

        var src = new int[] { 4, 8, 15, 16, 23, 42, 101 };

        var b = Enumerable.Range(0, src.Length)
                   .Select(index => index)
                   .GroupBy(index => index % 3)
                   .Select(indexes => indexes.Select(index => src[index]).ToArray())
                   .ToArray();
2
ответ дан 1 December 2019 в 23:14
поделиться

Что-то вроде этого должно сработать.

int[] list = new[] {1,2,3,4,5,6,7};
int[] offsets = new[] {0,1,2};
int[][] sorted = 
    offsets.Select((offset) => list.TakeWhile((_,ix,_) => ix % 3 == offset))

Предупреждение: не тестировалось. Я не программирую на C #, но идея должна быть ясной.

0
ответ дан 1 December 2019 в 23:14
поделиться

Это поможет получить группы из 3, если это то, что вам нужно?

Неприятный подход, однако :-)

int[] list = new [] {1,2,3,4,5,6,7};

    int count = 0;

    var x =
        from i in list.Where((c,i)=> i%3==0)
        let grp = list.Skip(count).Take(3)
        let temp = (count+=3)
        select new {
            grp
        };
1
ответ дан 1 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: