Лямбда / LINQ для VB.NET - PullRequest
       3

Лямбда / LINQ для VB.NET

0 голосов
/ 27 сентября 2018

У меня есть лямбда-код, который я хочу преобразовать в «простой» код VB.NET.

Я не нашел никакого инструмента, который бы преобразовывал лямбда-код в код, и я не понимаю, что этокод делает.

Что было бы хорошим способом понять, что делает этот код?

Особенно, я не знаю, что делает эта строка:

Let p3 = uDestPoints.First(Function(p) Math.Abs(p.X - t.P3.X) < 1 AndAlso Math.Abs(p.Y - t.P3.Y) < 1)
Select New With {Key .X1 = destList.IndexOf(p1), Key .X2 = destList.IndexOf(p2), Key .X3 = destList.IndexOf(p3)}

СпасибоВы.

Public Function GetWarps(ByVal uSourcePoints As IEnumerable(Of Point), ByVal uDestPoints As IEnumerable(Of Point), ByVal uDestTriangles As IEnumerable(Of Triangle)) As IEnumerable(Of Warp)
    ' build lists of source and destination landmark points
    Dim sourceList = uSourcePoints.ToList()
    Dim destList = uDestPoints.ToList()

    ' find all three triangle points in the list of destination landmark points
    Dim indices = From t In uDestTriangles
                  Let p1 = uDestPoints.First(Function(p) Math.Abs(p.X - t.P1.X) < 1 AndAlso Math.Abs(p.Y - t.P1.Y) < 1)
                  Let p2 = uDestPoints.First(Function(p) Math.Abs(p.X - t.P2.X) < 1 AndAlso Math.Abs(p.Y - t.P2.Y) < 1)
                  Let p3 = uDestPoints.First(Function(p) Math.Abs(p.X - t.P3.X) < 1 AndAlso Math.Abs(p.Y - t.P3.Y) < 1)
                  Select New With {Key .X1 = destList.IndexOf(p1), Key .X2 = destList.IndexOf(p2), Key .X3 = destList.IndexOf(p3)}

    ' return enumeration of warps from source to destination triangles
    Return From x In indices
           Select New Warp(New Triangle(sourceList(x.X1), sourceList(x.X2), sourceList(x.X3)), New Triangle(destList(x.X1), destList(x.X2), destList(x.X3)))
End Function

1 Ответ

0 голосов
/ 27 сентября 2018

Вот мой пример расширения.Я создал проблемную версию First, в которой не используется лямбда-параметр, и изменил код для использования ValueTuple вместо анонимного класса, поскольку вы не можете вернуть анонимные классы из Function.

Я также использовал List для агрегирования ответов LINQ, поскольку фактическое расширение функций генератора с использованием Yield не показалось мне ясным.

Из-за этих измененийэтот код менее эффективен, чем код LINQ в поколении, но более эффективен в First, так что, возможно, мытье?

Public Function FirstClosePoint(points As IEnumerable(Of Point), TP As Point) As Point
    For Each p In points
        If Math.Abs(p.X-TP.X) < 1 AndAlso Math.Abs(p.Y-TP.Y) < 1 Then
            Return p
        End If
    Next
    Throw New Exception("Unable to find FirstClosePoint")
End Function

Public Function GetWarps(ByVal uSourcePoints As IEnumerable(Of Point), ByVal uDestPoints As IEnumerable(Of Point), ByVal uDestTriangles As IEnumerable(Of Triangle)) As IEnumerable(Of Warp)
    ' build lists of source and destination landmark points
    Dim sourceList = uSourcePoints.ToList()
    Dim destList = uDestPoints.ToList()

    ' find all three triangle points in the list of destination landmark points
    Dim indices = New List(Of (X1 As Integer,X2 As Integer,X3 As Integer))

    For Each t In uDestTriangles
        Dim p1 = FirstClosePoint(uDestPoints, t.P1)
        Dim p2 = FirstClosePoint(uDestPoints, t.P2)
        Dim p3 = FirstClosePoint(uDestPoints, t.P3)
        indices.Add( (destList.IndexOf(p1),destList.IndexOf(p2),destList.IndexOf(p3)) )
    Next

    ' return enumeration of warps from source to destination triangles
    Dim ans = New List(Of Warp)

    For Each x In indices
        ans.Add(New Warp(New Triangle(sourceList(x.X1), sourceList(x.X2), sourceList(x.X3)), New Triangle(destList(x.X1), destList(x.X2), destList(x.X3))))
    Next

    Return ans
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...