Список столбцов в LINQ
Учитывая IEnumerable<T>
и количество строк, я хотел бы преобразовать его в IEnumerable<IEnumerable<T>>
так:
Input:
Row Count: 3
List: [1,2,3,4,5,6,7]
Выход
[
[1,4,7]
[2,5]
[3,6]
]
ИЗМЕНИТЬ
Я бы хотел, чтобы это работало для любого IEnumerable и не зависело от того, что T является Int32.
Как это сделать с помощью LINQ?
Ответы
Ответ 1
Это будет сделано:
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
Ответ 2
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();
hehe, и с помощью этого трюка мы можем избежать временной переменной, но код становится нечитаемым:
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();
Ответ 3
Это будет захватывать группы из 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
};
Ответ 4
Что-то вроде этого должно работать.
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))
Предупреждение: не проверено. Я не программирую в С#, но идея должна быть ясной.