Первая группа целиком:
[
{ "A": [person1, person2, person3] },
{ "B": [person4, person5, person6] }
]
Затем разбить его на куски за второй проход.В вашем случае вы хотите создать целый объект группы для каждого элемента раздела.Это потребует некоторого умения SelectMany для воссоздания группы.Группа. Группа человека снова восстановит ключ и создаст новую группу.
[
[
{ "A": [person1, person2] },
{ "A": [person3] }
],
[
{ "B": [person4, person5] },
{ "B": [person6] }
]
]
А также во втором проходе вы можете использовать SelectMany , чтобы сгладить его.
[
{ "A": [person1, person2] },
{ "A": [person3] },
{ "B": [person4, person5] },
{ "B": [person6] }
]
Вот критическая часть.Чанк включен в полный пример ниже:
var query = people.GroupBy(person => person.Group)
.SelectMany(g => g.Chunk(2))
.SelectMany(g => g.GroupBy(person => person.Group));
Вот полный пример.
using System;
using System.Collections.Generic;
using System.Linq;
public class Person
{
public string Name { get; set; }
public string Group { get; set; }
public override string ToString()
{
return string.Format("{0} ({1})", Name, Group);
}
}
public static class Extensions
{
public static IEnumerable<IEnumerable<T>> Chunk<T>(this IEnumerable<T> source, int chunksize)
{
while (source.Any())
{
yield return source.Take(chunksize);
source = source.Skip(chunksize);
}
}
}
class Program
{
static void Main(string[] args)
{
Person[] people = new Person[] {
new Person() { Name = "person1", Group = "A" },
new Person() { Name = "person2", Group = "A" },
new Person() { Name = "person3", Group = "A" },
new Person() { Name = "person4", Group = "B" },
new Person() { Name = "person5", Group = "B" },
new Person() { Name = "person6", Group = "B" }
};
var query = people.GroupBy(person => person.Group)
.SelectMany(g => g.Chunk(2))
.SelectMany(g => g.GroupBy(person => person.Group));
foreach (var group in query)
{
Console.WriteLine(group.Key);
foreach (var item in group)
{
Console.WriteLine(" {0}", item);
}
}
}
}