VB.NET 实现排除已完成行取最小众数 同频率优先取0或次小值
代码修正方案
错误点说明
- 过滤逻辑错误:
ColumnsFinished是与ColumnValues索引一一对应的标记列表,原代码用ColumnsFinished.Contains(i)判断完全不符合业务逻辑,无法正确过滤已完成行 - 排序逻辑缺漏:未显式处理频率一致时0的最高优先级规则,若存在小于0的数值会返回负数而非0,不符合需求
修正后代码
Dim ColumnValues As New List(Of Integer) Dim ColumnsFinished As New List(Of Boolean) ColumnValues.Clear() ColumnValues.Add(2) ColumnValues.Add(1) ColumnValues.Add(2) ColumnValues.Add(2) ColumnValues.Add(0) ColumnValues.Add(0) ColumnValues.Add(0) ColumnsFinished.Add(False) ColumnsFinished.Add(False) ColumnsFinished.Add(False) ColumnsFinished.Add(False) ColumnsFinished.Add(False) ColumnsFinished.Add(False) ColumnsFinished.Add(False) ' 按索引匹配过滤未标记为已完成的有效数值 Dim validValues = ColumnValues.Where(Function(val, idx) Not ColumnsFinished(idx)).ToList() Dim mostCommon As Integer = validValues. GroupBy(Function(x) x). OrderByDescending(Function(grp) grp.Count()). ' 优先按出现频率倒序 ThenBy(Function(grp) If(grp.Key = 0, 0, 1)). ' 频率相同时0优先级最高 ThenBy(Function(grp) grp.Key). ' 其余数值按从小到大排序 Select(Function(grp) grp.Key). FirstOrDefault()
逻辑说明
- 过滤逻辑完全匹配
ColumnsFinished的索引标记规则,对应位置标记为True的数值不会参与统计 - 你提供的测试用例中0和2出现频率均为3次,会优先返回0,符合需求
- 若所有数值频率一致且不存在0,会自动返回最小的数值
- 额外兼容了存在负数的场景:哪怕有比0更小的负数,只要出现频率相同,也会优先返回0
内容的提问来源于stack exchange,提问作者SSpoke
相关产品推荐
相关产品推荐

