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(...)通过增加值来对列表进行预排序。