2015-04-16 3 views
0

У меня есть объект A, в котором у меня есть длины. Я хотел бы заказать по убыванию длины, затем я хотел бы сгруппировать их по тройкам и вернуть этот список списка объектов.Выберите группу из n объектов в список списка объектов

Я могу заставить группу работать, но все, что я получаю, является ключом группировки, а не элементами.

public class a 
{ 
    public string Id { get; set; } 
    public int Length { get; set; } 
} 

List<a> c = Instantiate a list 

c.OrderByDescending(x => x.Length) 
.Select((e, i) => new { Item = e, Grouping = (i/3) }) 
.GroupBy(x => x.Grouping) 
.Select(x => x.Key) 
.ToList() 

Я думаю, что это как-то связано с моей группой, но я не могу заставить ее работать. Я бы хотел, чтобы List<List<a>> имел не более трех элементов.

+0

как я правильно понял, просто превратить .Select (х => x.Key) в .Select (х => x.ToList()) – Victor

+0

также, i/3 сломает вашу коллекцию на 3 части, чтобы разделить по длине, вы можете посмотреть ответ http://stackoverflow.com/questions/5215469/use-linq-to-break-up -listt-in-lots-of-list-of-n-length # 5215506 – Victor

+0

@Victor, вот что мне хотелось бы. По крайней мере, на данный момент я бы просто просто разбился на группы по три, когда он отсортирован по длине. – Herrozerro

ответ

2

Используйте это .Select(grp => grp.ToList()) вместо .Select(x => x.Key). Это вернет группу как List<a>.

+0

Я бы добавил к этому, что он, вероятно, хочет '.GroupBy (x => x.Grouping, x => x.Item)'. Это приведет к составлению списка списков '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+0

Спасибо! Это работало как шарм. – Herrozerro

0

После запроса будет генерировать список списков, где внутренний список содержит три элемента:

var listOfTriplets = c.OrderByDescending(x => x.Length) 
    .Select((x, i) => new { Index = i, Value = x }) 
    .GroupBy(x => x.Index/3) 
    .Select(x => x.Select(v => v.Value).ToList()) 
    .ToList(); 
Смежные вопросы