Heysa.. Jeg har et problem med nedenstående loops. Resultatet af dem er en liste over nogle navne og numre. Jeg vil gerne sammenligne om s1 og s2 til enhver tid er lig hinanden. Er der nogle der ved hvordan jeg kan gøre dette??
Det er to adskilte whileloops, der hver især ender ud med følgende resultat:
State no. 1 has name: Start 1. Start State no. 2 has name: Tjek markedet 2. Tjek markedet State no. 3 has name: Godkend kapital 3. Godkend kapital State no. 4 has name: Godkendelse af køb 4. Godkendelse af køb State no. 5 has name: Bestil nye skærme eller ej 5. Bestil nye skærme eller ej State no. 0 has name: Slut 0. Slut
State no. 1 has name: Start 1. Start State no. 2 has name: Muligheder 2. Muligheder State no. 3 has name: Godkend kapital 3. Godkend kapital State no. 4 has name: Må vi købe 4. Må vi købe State no. 5 has name: Bestil nye skærme eller ej 5. Bestil nye skærme eller ej State no. 6 has name: Er de kommet?? 6. Er de kommet?? State no. 0 has name: Slut 0. Slut
Det jeg gerne vil er, at sammenligne hver af statene, for at tjekke om de hedder det samme.
Hvis jeg prøver at merge løkkerne, som du foreslog, ender jeg op med at mangle "State no. 0 has name: Slut 0. Slut" fra den sidste tabel, da de ikke har samme antal states (den sidste har én mere).
Det er logisk nok at den mangler, når jeg bruger && i løkken, men jeg kan ikke bruge || i stedet, da det giver en masse output, som ikke skal være der. Hvordan kan jeg komme udenom dette problem?
Dvs. du har to enumerators, som du vil merge til at køre i samme løkke? Hvis du bruger IEnumerator's MoveNext metode, hjælper det ikke noget, at du bruger && til at kombinere udtrykkene og finde ud af, om løkken skal slutte, da den jo så vil slutte præcis når ét af kaldene til IEnumerator.MoveNext() returnerer false - da den kun kører imens \alle\ MoveNext kald returnerer true. Du havde det fremme før, at du havde prøvet at bruge || i stedet, men fik en masse mærkeligt output. Hvis du vil køre det her i samme løkke, skal du bruge bitwise OR og ikke boolean OR, da den vil sørge for, at løkken ikke slutter før alle enumereringsoperationerne er færdige, og at alle MoveNext() kald bliver udført hver gang løkkens udtryk udføres. Problemet med denne metode er jo, at første MoveNext kald jo godt kan returnere false selvom løkken stadig kører (fordi de andre kald returnerer true) - dvs. for hver IEnumerator der kører, skal du kunne tjekke, om den er nået til enden, inden du udfører nogle operationer. Prøv at forestil dig flg: jeg har to lister, der hver implementerer IEnumerator og kan læses fremad ved at kalde MoveNext(). Den ene liste består af {1, 2, 3} og den anden liste består af {4, 5, 6, 7}. Hvis jeg så vil bruge en kombination af disse to listers MoveNext() metode til at udskrive tallene i én løkke, så vil den første listes MoveNext() jo returnere false ét gennemløb før den anden liste gør det - dvs. hvis jeg bruger while (list1.MoveNext() && list2.MoveNext()) { } vil den gå ud af løkken efter tredje gennemløb når list1.MoveNext() returnerer false. Hvis jeg derimod bruger bitwise OR, |, vil den først slutte løkken efter fjerde gennemløb, som er det, jeg vil have. Problemet er dog, at inde i min løkke, skal jeg tage hensyn til, at listerne kan slutte uafhængigt af hinanden. For at løse dette, skal jeg kunne tjekke, om hver liste er nået til enden (dog ikke med et direkte kald til MoveNext(), da det vil ødelægge kaldet når løkken starter forfra). Så det, du har brug for, er en boolean indikator for hver liste, om den er nået til dens ende, da IEnumerator ikke har nogen metode, der returnerer, om den er nået til enden uden også at gå et skridt frem i den underliggende liste. Så du kan gøre på flg. måde: bool list1_end, list2_end; while ((list1_end = list1.MoveNext()) | (list2_end = list2.MoveNext())) { if (!list1_end) { //udfør operationer for liste 1 } if (!list2_end) { //udfør operationer for liste 2 } }
Mange tak. Det havde jeg ikke lige tænkt over. Bare send et svar :-)
Synes godt om
Ny brugerNybegynder
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.