vb.net - Linq vb.net 简单查询返回错误结果(没有产生结果)
问题描述
您好我正在尝试开发一个 Linq 查询来查找最低唯一值或最低值,该最低值也按行和列值排序。首先,它使用 BinarySearch 进行最低唯一值精确匹配(唯一值)如果没有找到,则进行部分匹配(最低值然后最低行然后列)具有最小值的值是输出(唯一(最小优先))或(未找到(如果未找到唯一的,则为最小的第二个或第一个))。
控制台返回此值
2,0,0
什么时候应该
2,1,1
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 alreadyFound As Boolean = False
Dim matching = ValuesFoundInPath.Where(Function(s)
Dim index As Integer = UniqueValuesFound.BinarySearch(s.Value)
If alreadyFound = False AndAlso index >= 0 Then
alreadyFound = True
Return True 'UniqueValuesFound(index) 'exact match
ElseIf alreadyFound = False AndAlso index < 0 Then
alreadyFound = True
Return True 's.Value
Else
Return False
End If
End Function).OrderBy(Function(p) p.Value).ThenBy(Function(p) p.Row).ThenBy(Function(p) p.Column)
Console.WriteLine(matching(0).Value.ToString & "," & matching(0).Row.ToString & "," & matching(0).Column.ToString)
End Sub
解决方案
解决了它,需要使用Find
而不是Where
问题消失了!
答案现在需要 2 个 linq 查询,而不是一个不能链接Find
ValuesFoundInPath = ValuesFoundInPath.OrderBy(Function(p) p.Row).ThenBy(Function(p) p.Column).ThenBy(Function(p) p.Value).ToList()
Dim alreadyFound As Boolean = False
Dim matching = ValuesFoundInPath.Find(Function(s)
Dim index As Integer = UniqueValuesFound.BinarySearch(s.Value)
If alreadyFound = False AndAlso index >= 0 Then
alreadyFound = True
Return True 'UniqueValuesFound(index) 'exact match
ElseIf alreadyFound = False AndAlso index < 0 Then
alreadyFound = True
Return True 's.Value
Else
Return False
End If
End Function)
Dim result As New Result
result.Answer = matching.Value
result.CurrentRow = matching.Row
result.CurrentColumn = matching.Column
您可能会遇到问题,因为Find(...)
总是预先对值列表进行排序。所以你需要使用FindIndex(...)
它来避免排序问题。
Dim matchingIndex = ValuesFoundInPath.FindIndex(Function(s)
Dim index As Integer = UniqueValuesFound.BinarySearch(s.Value)
If alreadyFound = False AndAlso index >= 0 Then
alreadyFound = True
Return True 'UniqueValuesFound(index) 'exact match
ElseIf alreadyFound = False AndAlso index < 0 Then
alreadyFound = True
Return True 's.Value
End If
Return False 'No match.
End Function)
If matchingIndex < 0 Then MessageBox.Show("Wtf!")
Dim result As New Result
result.Answer = ValuesFoundInPath(matchingIndex).Value
result.CurrentRow = ValuesFoundInPath(matchingIndex).Row
result.CurrentColumn = ValuesFoundInPath(matchingIndex).Column
它使OrderBy(...)
无用的,因为Find(...)
通过递增值对列表进行预排序。
推荐阅读
- liferay-7.1 - Liferay 7 粘土管理工具栏
- php - 如何更改 woocommerce 标题的 .cart-title
- javascript - 承诺履行后重定向到javascript中的另一个页面?
- javascript - 如何在 v-for vue js 中创建增量变量
- r - 在 RStudio 中加载 Tidyverse 的问题
- api - 为不同的管道(:api和:browser)呈现不同的错误?
- vue.js - Vue Props 值未在简单测试中通过
- c - 为什么最后一个索引的节点在使用 igraph 生成的随机网络中没有过度代表?
- rest - 如何形成nexus 3的搜索网址
- javascript - 在 Chart.js 中使用数组作为数据