Avatar billede adamjen Nybegynder
13. december 2006 - 21:53 Der er 14 kommentarer og
1 løsning

Rekursiv funktion i C#

Hej

I tillæg til et tidligere spørgsmål (http://www.eksperten.dk/spm/750416) vil jeg høre om følgende funktion kan konverteres fra VB til C#. Har selv gjort forsøget, men kan ikke få min C# funktion til at retunere de rigtige værdier :(

VB Eksempel
===========
Function Start(Optional xStrAddress As Variant) As String
    Dim i As Integer
    Dim aStrAddress As String
   
    For i = 1 To 3
       
        If Not IsMissing(xStrAddress) Then
            aStrAddress = xStrAddress
        End If
       
        aStrAddress = aStrAddress & CStr(i)
       
        Text1.Text = Text1.Text & aStrAddress & vbCrLf
       
        DoEvents
       
        If Len(aStrAddress) < 3 Then
            aStrAddress = Start(aStrAddress)
        End If
    Next
End Function


C# Eksempel
===========
private string Start(string xStrAddress)
{
    string aStrAddress = "";

    for (Int16 i = 0; i <= 3; i++)
    {
        if (xStrAddress.Length > 0)
        {
            aStrAddress = xStrAddress;
        }

        aStrAddress += i;

        if (aStrAddress.Length < 3)
        {
            aStrAddress = Run(aStrAddress);
        }

        textAddress.Text += aStrAddress + "\r\n";

        Application.DoEvents();
    }
    return xStrAddress;
}

Håber der nogle der kan hjælpe :)
Avatar billede dj_uncas Nybegynder
13. december 2006 - 22:19 #1
For at være tættere på VB løsningen kan du prøve dette:

private string Start(string xStrAddress)
{
    string aStrAddress = "";

    for (Int16 i = 0; i <= 3; i++)
    {
        if (xStrAddress.Length > 0)
        {
            aStrAddress = xStrAddress;
        }

        aStrAddress += i;

        textAddress.Text += aStrAddress + "\r\n";

        Application.DoEvents();

        if (aStrAddress.Length < 3)
        {
            aStrAddress = Start(aStrAddress);
        }
    }
    return xStrAddress;
}


Læg mærke til at jeg har flyttet setteren af textAddress.Text og Application.DoEvents() samt kaldt "Start" i stedet for "Run" i den anden løkke... Jeg ved ikke om det her gør det bedre, men prøv det ;-)
Avatar billede arne_v Ekspert
13. december 2006 - 22:30 #2
For i = 1 To 3

er vel ikke

for (Int16 i = 0; i <= 3; i++)

men

for (int i = 1; i <= 3; i++)
Avatar billede hacked Nybegynder
13. december 2006 - 22:42 #3
Dernæst er xStrAddress en Variant. Man kan semi-sige at object er det tilsvarende i C#. I fremtidig version af .Net vil 'var' nok blive brugt.
Dernæst står der at xStrAddress er Optional.
I C# skriver gør du følgende:

using System.Runtime.InteropServices;

string Start([Optional] object xStrAddress) {
  for........
    if(xStrAddress == Type.Missing) {
      ..... 
    }
}

Det kommer an på hvordan man ser på tingene.
Avatar billede hacked Nybegynder
13. december 2006 - 22:43 #4
-gør
Avatar billede dj_uncas Nybegynder
13. december 2006 - 22:46 #5
"var" vil ikke blive brugt (i hvert fald ikke i C# 3.0) da den kun lever internt i metoder...
Avatar billede hacked Nybegynder
13. december 2006 - 22:51 #6
hov rettelse: if(xStrAddress != Type.Missing)
Avatar billede hacked Nybegynder
13. december 2006 - 22:52 #7
Derfor nævnte jeg intet om 3.0 ;) 3.0 er blevet lanceret.
Avatar billede hacked Nybegynder
13. december 2006 - 22:53 #8
Hvis du mener .Net 3.0
Avatar billede hacked Nybegynder
13. december 2006 - 22:55 #9
Glem den sidste kommentar og "3.0 er blevet lanceret.".
Avatar billede adamjen Nybegynder
13. december 2006 - 23:11 #10
Desværre dj_uncas... Får desværre samme resultat som før, selvom jeg flytter textAddress.Text og Application.DoEvents(). Det resultat jeg får ud er fgl.:

1
11
111
112
113
12
121
122
123
13
131
132
133
12
121
122
123
123
Avatar billede hacked Nybegynder
13. december 2006 - 23:25 #11
Jeg må have leget for meget med Excel. Optional virker ikke her.
Avatar billede hacked Nybegynder
13. december 2006 - 23:29 #12
adamjen: Kan du ikke skrive hvilket input du giver og hvad output skal være?
Avatar billede adamjen Nybegynder
14. december 2006 - 07:03 #13
Jeg kommer ikke med noget input til funktionen. Kalder den blot med en tom parameter: Start("")

Mit output skal være følgende:

1
11
111
112
113
12
121
122
123
13
131
132
133
2
21
211
212
...
333
Avatar billede adamjen Nybegynder
14. december 2006 - 15:41 #14
Har spurgt et par kollegaer fra arbejde, og vi er sammen kommet frem til en løsning. Grunden til at jeg ikke får det korrekt output i mit C# eksempel, er fordi jeg retunere en forkert parameter. I VB eksemplet retunere jeg en tom streng, og det samme skal være gældende for mit C# eksempel. Så C# koden vil komme til at se således ud:

private string Start(string xStrAddress)
{
    string aStrAddress = "";

    for (Int16 i = 0; i <= 3; i++)
    {
        if (xStrAddress.Length > 0)
        {
            aStrAddress = xStrAddress;
        }

        aStrAddress += i;

        textAddress.Text += aStrAddress + "\r\n";

        Application.DoEvents();

        if (aStrAddress.Length < 3)
        {
            aStrAddress = Start(aStrAddress);
        }
    }
    return ""; //HER RETUNERE JEG EN TOM STRENG
}

Vil dog gerne give dig et par point dj_uncas, eftersom at dit første eksempel var en årsag til at det kom til at fungere korrekt.
Avatar billede dj_uncas Nybegynder
15. december 2006 - 11:28 #15
Dem ager jeg så imod. Men jeg vil gerne dele hvis der er andre der vil have nogen med?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester