Avatar billede r.hegaard Nybegynder
13. august 2006 - 14:46 Der er 34 kommentarer og
1 løsning

Navngivning af loop - Java vs. C#

I Java kan man f.eks. skrive sådan her:
ydre:
for(int i=0;i<10;i++){
    for(int ii=0;ii<10;ii++){
        if(i==5 && ii=5){
            break ydre;
        }
    }
}

Kan man gøre noget lignende i C#??
Avatar billede thesurfer Nybegynder
13. august 2006 - 15:25 #1
Ja.
Avatar billede thesurfer Nybegynder
13. august 2006 - 15:26 #2
Hmm.. vent..
Du kunne lave det på en anden måde, med en IF-sætning..

Jeg ved ikke om man kan bryde ydre-loop, fra indre-loop..
Avatar billede thesurfer Nybegynder
13. august 2006 - 15:27 #3
Eksempel:

bool hop_ud = false;
for(int i=0;i<10;i++){
if (hop_ud == true) break;
    for(int ii=0;ii<10;ii++){
        if(i==5 && ii=5){
                        hop_ud = true;
            break ydre;
        }
    }
}
Avatar billede thesurfer Nybegynder
13. august 2006 - 15:29 #4
Der gik formateringen i stykker.. her skulle den være i orden:

bool hop_ud = false;
for(int i=0;i<10;i++){
if (hop_ud == true) break;
    for(int ii=0;ii<10;ii++){
        if(i==5 && ii=5){
            hop_ud = true;
            break ydre;
        }
    }
}


Det kan godt være, at man kan break en parent loop.. men ved ikke lige hvordan, da man jo skal definere loopen, og ikke en label (som man kan "goto", f.eks.)..
Avatar billede arne_v Ekspert
13. august 2006 - 16:03 #5
C# understøtter ikke

break mylabel;

syntaxen som Java gør.

Men til gengæld kan man i C# bruge

goto mylabel;

i stedet for for (hvilket man ikke kan i Java)
Avatar billede arne_v Ekspert
13. august 2006 - 16:05 #6
og det er så forkert

det er ikke valid C# 1.x syntax

det er tilsyneladende valid C# 2.x syntax

så hvis man er på C# 2.0 så virker det præcis ligesom i Java
Avatar billede Syska Mester
13. august 2006 - 16:14 #7
øhhh, hvordan ser koden ud i C#?

Synes ikke rigtig jeg kan få den til at bryde parent...

// ouT
Avatar billede r.hegaard Nybegynder
13. august 2006 - 16:14 #8
arne_v >> Jeg synes ikke lige, at jeg kan få det til at virke i C# 2.0. Har du et eksempel??
Avatar billede arne_v Ekspert
13. august 2006 - 16:35 #9
det kan jeg godt forstå I ikke kan

jeg fumler rundt i det

det virker heller ikke i C# 2.0

jeg havde rettet break til goto da det compilede i C# 2.0

jeg beklager forvirringen
Avatar billede Syska Mester
13. august 2006 - 16:37 #10
heheh, det kan jo for selv den bedste... :-)
Avatar billede thesurfer Nybegynder
13. august 2006 - 17:17 #11
Det ville ellers være godt, hvis man kunne springe ud af en hvilken som helst loop..
Hvis ikke, kan man programmere sig ud af det, som eksemplet i 13/08-2006 15:29:15.

Gad vide hvad der er bedst.. at have checket (IF-sætningen) før eller efter den indre loop..

Det må nok være efter indre-loop, da den skal kunne hoppe helt ud, så snart at betingelsen er opfyldt..

På den anden side.. hvis hop_ud ikke sættes på linien før ydre-loop, ville det også være en god ide, at checket er den første linie i ydre-loop.

Men i en situation som den nuværende, ville jeg nok side at checket skulle være lige efter indre-loop..

:-)
Avatar billede arne_v Ekspert
13. august 2006 - 20:26 #12
hvorfor ikke bruge goto ?
Avatar billede thesurfer Nybegynder
13. august 2006 - 20:50 #13
arne_v> Hvis "hvorfor ikke bruge goto ?" var til mig:

Normalt bruger jeg ikke labels og goto.. ikke fordi mange påstår, at det er dårlig programmeringsskik, hvilket jeg ikke synes at det er.. men det er sjældent jeg er i en situation hvor jeg har brug for det.

Jeg bruger typisk labels og goto når jeg programmer/laver batch (.bat) filer, hvor det kan være særdeles fordelagtigt, at kunne hoppe til et bestemt sted, og udføre noget betinget kode.
Avatar billede arne_v Ekspert
13. august 2006 - 21:35 #14
men er:

ydre:
for(int i=0;i<10;i++){
    for(int ii=0;ii<10;ii++){
        if(i==5 && ii=5){
            goto ydre;
        }
    }
}

i C# ikke den mest direkte oversættelse af

ydre:
for(int i=0;i<10;i++){
    for(int ii=0;ii<10;ii++){
        if(i==5 && ii=5){
            break ydre;
        }
    }
}

i Java ?
Avatar billede thesurfer Nybegynder
13. august 2006 - 23:29 #15
Hmm.. Jeg vil tro at det er stik modsat..

Hvis man bruger goto, vil den forsætte med at afvikle kode, fra den linie hvor label'en er på..

Dvs, den vil go ind i løkken igen, hvor Java vil få videre, dvs, efter løkken.

Sådan fungerer goto normalt..
Avatar billede thesurfer Nybegynder
13. august 2006 - 23:32 #16
Jeg tror at det er sådan:

Eksempel med C#, hvor den hele tiden vil hoppe til linie 01, når både "i" og "ii" er lig 5:

01: ydre:
02: for(int i=0;i<10;i++){
03:    for(int ii=0;ii<10;ii++){
04:        if(i==5 && ii=5){
05:            goto ydre;
06:        }
07:    }
08: }
09: hello world

Eksempel med Java, hvor den vil gå til linie 09, når både "i" og "ii" er lig 5:
01: ydre:
02: for(int i=0;i<10;i++){
03:    for(int ii=0;ii<10;ii++){
04:        if(i==5 && ii=5){
05:            break ydre;
06:        }
07:    }
08: }
09: hello world
Avatar billede thesurfer Nybegynder
13. august 2006 - 23:40 #17
..det er hvis goto i C# fungerer ligesom goto i en .bat fil..

Dvs, når den har løbet "i" og "ii" igennem, og begge værdier er lig 5, vil den starte forfra, med at løbe ind if for-løkken, og loop indtil "i" og "ii" er lig 5, hvorefter den gentager igen.. og igen.. og igen.. en evig loop.

Med break, hvis det er ligesom JavaScript (og C#), vil den først hoppe ud af "ii++"-loopen, og fortsætte med "i++" loopen, og til sidst vil den fortsætte med linie 09.

Dvs, break hopper ikke direkte til linie 09, men fortsætter med "i++"-loopen, hvilket er overflødigt, så derfor ville man normalt lave et check, som hoppe ud af "i++"-loppen.


Her er det smarte så, hvis man kan breake en bestemt for-løkke.

Jeg har ikke prøvet labels i Java, men for mig ser det ikke ud til at man kan gøre det, på den måde, for label'en har jo ikke noget med for-løkken at gøre..
Avatar billede thesurfer Nybegynder
13. august 2006 - 23:41 #18
Hvis jeg skulle lave det med labels, ville jeg nok lave det sådan her:

for(int i=0;i<10;i++){
    for(int ii=0;ii<10;ii++){
        if(i==5 && ii=5){
            goto ude_nu;
        }
    }
}
ude_nu:

Dvs, putte label'en efter den ydre loop.
Avatar billede thesurfer Nybegynder
13. august 2006 - 23:43 #19
Jeg har lige set, at jeg i 13/08-2006 15:29:15 også har "ydre" i break-linien: break ydre;

Det var fordi jeg kopierede hele koden.. Jeg ved ikke om man kan gøre det..
Avatar billede arne_v Ekspert
13. august 2006 - 23:49 #20
du har ret i at med goto skal labelen naturligvis være nedenfor for løkken og ikke
ovenfor

men jeg synes stadig at goto label matcher break label bedst
Avatar billede arne_v Ekspert
13. august 2006 - 23:53 #21
package august;

public class Break {
    public static void main(String[] args) {
        ydre:
            for(int i=0;i<10;i++){
                for(int ii=0;ii<10;ii++){
                    System.out.println(i + " " + ii);
                    if(i==5 && ii==5){
                        break ydre;
                    }
                }
            }
    }
}

og

using System;

namespace E
{
    public class MainClass
    {
        public static void Main(string[] args)
        {
            for(int i=0;i<10;i++){
                for(int ii=0;ii<10;ii++){
                    Console.WriteLine(i + " " + ii);
                    if(i==5 && ii==5){
                        goto ydre;
                    }
                }
            }
        ydre:
            ;
        }
    }
}

udskriver det samme
Avatar billede thesurfer Nybegynder
13. august 2006 - 23:57 #22
Hvis "break ydre;" virker, må det svare til "goto ydre;".

Jeg har bare aldrig set "break ydre;", men har ofte brugt "goto ydre", i f.eks. .bat filer (og vist nok også Basic på Commodore 64).. så goto virker mere logisk for mig.. :-)
Avatar billede arne_v Ekspert
14. august 2006 - 00:06 #23
det er også en spøjs konstruktion men da Java ikke har goto har man ligesom villet
givet noget

package august;

public class Break2 {
    public static void main(String[] args) {
        boolean usegoto = true;
        label1:
        {
            System.out.println("start 1");
            label2:
            {
                System.out.println("start 2");
                label3:
                {
                    System.out.println("start 3");
                    if(usegoto) {
                        break label2;
                    }
                    System.out.println("slut 3");
                }
                System.out.println("slut 2");
            }
            System.out.println("slut 1");
        }
    }
}

udskriver:

start 1
start 2
start 3
slut 1
Avatar billede thesurfer Nybegynder
14. august 2006 - 00:47 #24
Ahh, ok.. nu forstår jeg labels i Java :-)

Man definerer simpelthen en blok, hvori man har noget kode.. :-)

I .bat er det bare en linie, hvor man kan hoppe til, og den vil fortsætte med at afvikle næste linie (den nede under)..

Så kan jeg godt se pointen i "break ydre".. :-)
Det er da smart.. :-)
Avatar billede md_craig Nybegynder
14. august 2006 - 14:34 #25
Ja som folk nu nok efterhånden har opdaget, så giver virkemåden i Java god mening, da du beder den om at "break" en blok, dvs. afslutte en blok... mens i C# beder du den "goto" en label, dvs hoppe til et givent punkt i koden, syns jeg personligt giver god mening....

Men IMO giver det mere fleksibilitet i C#...
Avatar billede r.hegaard Nybegynder
14. august 2006 - 17:22 #26
Sikke da en lang udredning I fik lavet - jeg skulle bare vide, om der var et simpelt alternativ. Det ser ud til, at det må være goto.
Tak for hjælpen. Lægger I et svar?
Avatar billede arne_v Ekspert
14. august 2006 - 17:39 #27
det er nok mest min skyld at det blev trukket ud fordi jeg kludrede i det med
.NET 2.0 testen i foerste omgang og ikke fik placeret labelen korrekt i goto
eksemplet

og et svar fra mig
Avatar billede thesurfer Nybegynder
14. august 2006 - 23:43 #28
Ingen points til mig, tak. :-)
Avatar billede ismand Nybegynder
17. august 2006 - 02:48 #29
int doBreak = 0;
for(int i=0;i<10;i++){
    for(int ii=0;ii<10;ii++){
        if(i==5 && ii=5){
            doBreak = 1;
            break;
        }
    }
    if (doBreak)
            break;
}

ville nok være min løsning.. labels er så... BASIC-agtigt ?
Avatar billede md_craig Nybegynder
17. august 2006 - 08:51 #30
ismand >>

Nu kan labels rent faktisk give performance forbedringer, selv om de måske er til at vrinke på næsen af til at starte med, så er kan de blive meget nyttige...

Deusden, så overvej din egen løsning i længden... hvis du begynder at udvide koden meget, så vil jeg mene at et label vil kunne give mere overskuelighed i hvad der sker, end det du laver...
Avatar billede thesurfer Nybegynder
17. august 2006 - 09:25 #31
ismand> Din løsning er den samme som 13/08-2006 15:29:15.

Det er korrekt, at den løsning ikke er holdbar, hvis man har en masse nestede loops, da man så skal have mange booleans og en masse if sætninger.

Her ville en label klart være bedre, da du kan hoppe ud af samtlige loops, med 1 linie.

Hvis man ikke lige kan se pointen med dette indlæg, kan man prøve at lave 100 for-loops.. :-)
Prøv med booleans, og derefter med en label.
Avatar billede ismand Nybegynder
17. august 2006 - 12:56 #32
jeg kan sagtens se jeres argumentation for at det skulle virke bedre med labels.

Hvad med så simpelthen at smide hele skidtet ind i en funktion? og bruge 'return'?

------

givet:
int i = 0;
int n = 0;

this.LooperFunction(i,n, ...);

private void LooperFunction(int i, int n)
{
    for(int i=0;i<10;i++){
        for(int ii=0;ii<10;ii++){
            if(i==5 && ii=5){
                return;
            }
        }
    }
}

mere overskueligt :)
Avatar billede ismand Nybegynder
17. august 2006 - 12:56 #33
*rettelse: ii == n)*
Avatar billede md_craig Nybegynder
17. august 2006 - 13:21 #34
ismand >>

Så prøv at evaluere:

private void UglyNestedLoops()
{
    for(int i=0;i<10;i++){
        for(int ii=0;ii<10;ii++){
            if(i==5 && ii=5){
        if(someOtherCondition)
            goto marker_A;
        else
            goto marker_D;
            }
        }
    }
    marker_A:

    for(int j=0;j<10;j++){
        for(int i=0;i<10;i++){
            for(int ii=0;ii<10;ii++){
                if(i==5 && ii=5){
            if(someOtherCondition)
                goto marker_B;
            else if(someSecoundCondition)
                goto marker_C;
            else
            goto marker_D;
                }
            }
        }
        marker_B:

        for(int i=0;i<10;i++){
            for(int ii=0;ii<10;ii++){
                if(i==5 && ii=5){
            if(someOtherCondition)
                goto marker_A;
            else
                goto marker_D;
                }
            }
        }
    }
    marker_C:

    for(int i=0;i<10;i++){
        for(int ii=0;ii<10;ii++){
            if(i==5 && ii=5){
        if(someOtherCondition)
            goto marker_A;
        else
            goto marker_D;
            }
        }
    }
    marker_D:
}

----------------------------------------------------

Det virker måske som en YDERST usandsynlig nødvendighed at hoppe sådan rundt i tingene... never det less så sker det faktisk for visse algoritmer at man med fordel kan speede dem op ved at gøre det....

Det her er naturligvis et tænkt eksempel, men jeg har set det blive brugt smart hvor "lyset" ligsom går op for en
Avatar billede r.hegaard Nybegynder
17. august 2006 - 22:32 #35
Tak for hjælpen.
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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