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

本文关键字:Groupby 列表 使用 然后 | 更新日期: 2023-09-27 18:29:32

作为标题。

例如,我有一个包含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}

第3组(125):{3,8}

第4组(126):{4}

组5(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}

解释与顶部示例相同

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

基本思想:

  • 按数量对组进行排序
  • 从两边循环,组合起来的数量不超过最大数量

伪代码:

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