2013-08-30 3 views
1

As Title.Используя Groupby для группировки списка, а затем группируйте их снова, а затем на основе количества

Например, у меня есть список, который содержит 10 пунктов.

Id Name GroupId 
1  abc  123 
2  abc1 124 
3  abc2 125 
4  abc3 126 
5  abc4 123 
6  abc5 123 
7  abc6 124 
8  abc7 125 
9  abc8 127 
10 abc9 124 

Var groups = items.OrderBy(m => m.GroupId).GroupBy(o => o.GroupId); 

Тогда у меня есть 5 групп.

Группа1 (123): {1, 5, 6}

Группа2 (124): {2, 7, 10}

Group3 (125): {3, 8}

Group4 (126): {4}

Group5 (127): {9}

Теперь я хочу, чтобы перегруппировать их на основе максимального количества новой группы.

например: если maxQuantity = 4

newGroup1: {1,5,6,4} (4 происходит потому, что group2 и group3 не может группа внутри newGroup1) "Они имеют больше чем 1 деталь и newGroup1 только может вставить 1 пункт."

newGroup2: {2,7,10,9} (такое же объяснение, как newGroup1)

newGroup3: {3,8} (только осталось 2 пунктов, то они имеют в группу вместе.)

Любая идея по кодированию? Я трачу 8 часов на сидячее кресло, чтобы подумать об этой проблеме и все еще рассчитывать.

* Другой случай, если maxQuantity = 2

newGroup1: {1, 5} 
newGroup2: {6, 4} 
newGroup3: {2, 7} 
newGroup4: {10, 9} 
newGroup5: {3, 8} 

Объяснение так же, как верхний пример

+0

Я немного смущен о вашем правиле, почему не может '' NewGroup1''' {1,5,6,9} '? (9 вместо 4) –

+3

Я думаю, что это то, где вам нужно оставить linq и пойти «Old-Fashioned» – Sayse

+0

@ Сейз не очень, я думаю, что это «родная мода». –

ответ

0

Основная идея:

  • Сортировать группы по количеству.
  • Итерация с обеих сторон, объединение групп, которые составляют не более чем максимальное количество.

Псевдо-код:

sort groups by quantity (biggest group first) 
i = 0 
j = groups.size-1 

while i <= j 
    // if the indices met, pick either 
    // if the two groups are larger than max quantity, simply pick the larger one 
    if i == j || union(groups[i], groups[j]).size > maxQuantity 
    output groups[i] 
    i++ 
    else 
    output union(groups[i], groups[j]) 
    i++ 
    j-- 

Если элементы являются уникальными:

union(groups[i], groups[j]).size = groups[i].size + groups[j].size 

LINQ?

Это, скорее всего, выходит за рамки возможностей LINQ. Что касается кода C#, то он должен быть достаточно простым для получения псевдокода.

+0

hmmm. не совсем понимаю, как это работает. Головная боль!! –

Смежные вопросы