使用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}
解释与顶部示例相同
基本思想:
- 按数量对组进行排序
- 从两边循环,组合起来的数量不超过最大数量
伪代码:
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#代码,它应该足够简单,可以从伪代码中派生出来。