VB.NET实现查找最低唯一值的Linq查询返回结果错误问题排查
问题根因
现有代码核心逻辑存在两处严重错误:
- 过滤逻辑完全不符合需求:
Where从句中依赖外部变量alreadyFound做状态控制,遍历到ValuesFoundInPath的第一个元素时就会标记已找到、过滤掉所有后续元素,后续的排序逻辑根本不会生效,完全没有实现「优先匹配最低唯一值」的规则 - 优先级规则未实现:没有先筛选属于唯一值集合的候选、再兜底取全局最小值的逻辑,直接按列表添加顺序返回第一个元素
修正实现
正确实现逻辑:
- 先对所有候选值按要求排序:优先级为值升序→行号升序→列号升序
- 优先从排序后的候选中查找第一个属于唯一值集合的元素
- 若未找到符合条件的唯一值,取排序后的第一个元素(全局最小值)
修正后的代码如下:
Private Sub Button11_Click(sender As Object, e As EventArgs) Handles Button11.Click Dim UniqueValuesFound As New List(Of Short) Dim ValuesFoundInPath As New List(Of FoundValue) UniqueValuesFound.Add(1) 'UniqueValuesFound.Add(0) 'UniqueValuesFound.Add(2) 'UniqueValuesFound.Add(3) UniqueValuesFound = UniqueValuesFound.Distinct().ToList() UniqueValuesFound.Sort() Dim foundValue As New FoundValue foundValue.Value = 2 foundValue.Row = 1 foundValue.Column = 1 ValuesFoundInPath.Add(foundValue) 'foundValue = New FoundValue 'foundValue.Value = 3 'foundValue.Row = 0 'foundValue.Column = 2 'ValuesFoundInPath.Add(foundValue) 'foundValue = New FoundValue 'foundValue.Value = 2 'foundValue.Row = 0 'foundValue.Column = 2 'ValuesFoundInPath.Add(foundValue) 'foundValue = New FoundValue 'foundValue.Value = 0 'foundValue.Row = 2 'foundValue.Column = 0 'ValuesFoundInPath.Add(foundValue) ' 第一步:对所有候选值按规则排序 Dim sortedCandidates = ValuesFoundInPath. OrderBy(Function(p) p.Value). ThenBy(Function(p) p.Row). ThenBy(Function(p) p.Column). ToList() ' 第二步:优先查找最低唯一值 Dim targetValue = sortedCandidates. FirstOrDefault(Function(s) UniqueValuesFound.BinarySearch(s.Value) >= 0) ' 第三步:未找到唯一值则取全局最小值 If targetValue Is Nothing Then targetValue = sortedCandidates.First() End If Console.WriteLine($"{targetValue.Value},{targetValue.Row},{targetValue.Column}") End Sub
用你提供的测试数据运行后,输出结果为2,1,1,符合预期。
内容的提问来源于stack exchange,提问作者SSpoke
相关产品推荐
相关产品推荐

