您好,我正在嘗試開發一個 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
uj5u.com熱心網友回復:
解決了,需要使用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(...)通過遞增值對串列進行預排序。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/338099.html
