使用Groupby对列表进行分组,然后再根据数量对它们进行分组

时间:2013-08-30 06:28:43

标签: c#

作为标题。

例如,我有一个包含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中分组)“他们有多个项目,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}

与顶部示例相同的解释

1 个答案:

答案 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#代码,它应该很简单,可以从伪代码中派生出来。