Linq vb.net 返回错误结果的简单查询(没有产生结果)

Linq vb.net simple query returning bad results (no yielding results)

您好,我正在尝试开发一个 Linq 查询来查找最低唯一值或最低值,该值也按行和列值排序。 首先,它使用 BinarySearch(唯一值)进行最低唯一值精确匹配 如果未找到任何内容,则它会进行部分匹配(最低值然后最低行然后列) 具有最小值的是输出(唯一的(最小的第一个))或(未找到的(最小的第二个或第一个如果未找到唯一的))。

控制台returns这个值

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