首页 > 解决方案 > 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

标签: vb.netlinq

解决方案


解决了它,需要使用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(...)通过递增值对列表进行预排序。


推荐阅读