larry118 Ответов: 2

Проблема с преобразованием линейной рекурсивной функции из C# в VB .NET


У меня есть функция в C#, которую я хочу преобразовать в vb. Мне никогда не везло со встроенными функциями в vb. Код C# является:

public Double CalculateMeanError(ImageBuffer target, Int32 parallelTaskCount = 4)
        {
            // checks parameters
            Guard.CheckNull(target, "target");

            // initializes the error
            Int64 totalError = 0;

            // prepares the function
            bool calculateMeanError(Pixel sourcePixel, Pixel targetPixel)
            {
                Color sourceColor = GetColorFromPixel(sourcePixel);
                Color targetColor = GetColorFromPixel(targetPixel);
                totalError += ColorModelHelper.GetColorEuclideanDistance(ColorModel.RedGreenBlue, sourceColor, targetColor);
                return false;
            }

            // performs the image scan, using a chosen method
            IList<Point> standardPath = new StandardPathProvider().GetPointPath(Width, Height);
            TransformPerPixel(target, standardPath, calculateMeanError, parallelTaskCount);

            // returns the calculates RMSD
            return Math.Sqrt(totalError/(3.0*Width*Height));
        }


Что я уже пробовал:

Я попробовал несколько различных преобразователей кода, но он зависает на встроенной рекурсивной функции calculateMeanError. Я ценю помощь в наследовании против реализации. Вот лучший vb-код на данный момент.

Public Function CalculateMeanError(ByVal target As ImageBuffer, Optional ByVal parallelTaskCount As Int32 = 4) As Double
    ' checks parameters
    Guard.CheckNull(target, "target")
    ' initializes the error
    Dim totalError As Int64 = 0
    ' prepares the function
    Dim calculateMeanError As Boolean
    Pixel
    sourcePixel
    Dim targetPixel As Pixel
    Dim sourceColor As Color = GetColorFromPixel(sourcePixel)
    Dim targetColor As Color = GetColorFromPixel(targetPixel)
    totalError = (totalError + ColorModelHelper.GetColorEuclideanDistance(ColorModel.RedGreenBlue, sourceColor, targetColor))
    Return false
    ' performs the image scan, using a chosen method
    Dim standardPath As IList(Of Point) = (New StandardPathProvider + GetPointPath(Width, Height))
    TransformPerPixel(target, standardPath, calculateMeanError, parallelTaskCount)
    ' returns the calculates RMSD
    Return Math.Sqrt((totalError / (3  _
                    * (Width * Height))))
End Function

2 Ответов

Рейтинг:
16

Richard Deeming

Попробуй:

Public Function CalculateMeanError(ByVal target As ImageBuffer, Optional ByVal parallelTaskCount As Int32 = 4) As Double
    Guard.CheckNull(target, "target")
    
    Dim totalError As Int64 = 0
    
    Dim fn As Func(Of Pixel, Pixel, Boolean) = Function(sourcePixel As Pixel, targetPixel As Pixel)
        Dim sourceColor As Color = GetColorFromPixel(sourcePixel)
        Dim targetColor As Color = GetColorFromPixel(targetPixel)
        totalError += ColorModelHelper.GetColorEuclideanDistance(ColorModel.RedGreenBlue, sourceColor, targetColor)
        Return False
    End Function
    
    Dim standardPath As IList(Of Point) = New StandardPathProvider().GetPointPath(Width, Height)
    TransformPerPixel(target, standardPath, fn, parallelTaskCount)

    Return Math.Sqrt(totalError / (3.0 * Width * Height))
End Function
Лямбда-Выражения (Visual Basic) | Microsoft Docs[^]


Рейтинг:
0

#realJSOP

Попробуйте изменить имя переменной на что-нибудь другое. VB не чувствителен к регистру, поэтому преобразователь кода может путать внутреннее имя var с именем функции.


larry118

Я попробовал оба этих решения, это самое близкое, что я получил.

Public Function CalculateMeanError(ByVal target As ImageBuffer, Optional ByVal parallelTaskCount As Int32 = 4) As Double
            ' checks parameters
            Guard.CheckNull(target, "target")
            ' initializes the error
            Dim totalError As Int64 = 0
            ' prepares the function

            Dim fn1 As Func(Of Pixel, Pixel, Boolean) = Function(ByVal sourcePixel As Pixel, ByVal targetPixel As Pixel)
                                                            Dim sourceColor As Color = GetColorFromPixel(sourcePixel)
                                                            Dim targetColor As Color = GetColorFromPixel(targetPixel)
                                                            totalError += ColorModelHelper.GetColorEuclideanDistance(ColorModel.RedGreenBlue, sourceColor, targetColor)
                                                            Return False
                                                        End Function

            Dim standardPath As IList(Of Point) = New StandardPathProvider().GetPointPath(Width, Height)
            TransformPerPixel(target, standardPath, fn1, parallelTaskCount)

            Return Math.Sqrt(totalError / (3.0 * Width * Height))
            Return False

        End Function<pre>

The error I get now is from the transformPerPixel(...,...,fn1,...) Says fn1 is value of type(Func(Of pixel,Pixel,Boolean) cannot be converted to ImageBuffer.transformPixelfunction.