Avatar billede smsng Nybegynder
27. juli 2005 - 16:47 Der er 7 kommentarer

while loops

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??

while(nodeNumber1.MoveNext() && nodeName1.MoveNext())
{   
Console.WriteLine("State no. {0} has name: {1}",      nodeNumber1.Current.Value, nodeName1.Current.Value);

statenofile1 = nodeNumber1.Current.Value.ToString();
statenamefile1 = nodeName1.Current.Value.ToString();
string s1 = statenofile1 + ". " + statenamefile1;
}
                   
while(nodeNumber2.MoveNext() && nodeName2.MoveNext())
{
Console.WriteLine("State no. {0} has name: {1}", nodeNumber2.Current.Value, nodeName2.Current.Value);

statenofile2 = nodeNumber2.Current.Value.ToString();
statenamefile2 = nodeName2.Current.Value.ToString();
string s2 = statenofile2 + ". " + statenamefile2;
}
Avatar billede arne_v Ekspert
27. juli 2005 - 16:52 #1
jeg forstår ikke din kode

er det:

while(nodeNumber1.MoveNext() && nodeName1.MoveNext() && nodeNumber2.MoveNext() && nodeName2.MoveNext())

  Console.WriteLine("State no. {0} has name: {1}",      nodeNumber1.Current.Value, nodeName1.Current.Value);
  statenofile1 = nodeNumber1.Current.Value.ToString();
  statenamefile1 = nodeName1.Current.Value.ToString();
  string s1 = statenofile1 + ". " + statenamefile1;
  Console.WriteLine("State no. {0} has name: {1}", nodeNumber2.Current.Value, nodeName2.Current.Value);
  statenofile2 = nodeNumber2.Current.Value.ToString();
  statenamefile2 = nodeName2.Current.Value.ToString();
  string s2 = statenofile2 + ". " + statenamefile2;
  if(s1 == s2)
  {
      ...
  }
  else
  {
    ...
  }
}

du leder efter ?
Avatar billede smsng Nybegynder
27. juli 2005 - 17:02 #2
Ik helt.

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.
Avatar billede arne_v Ekspert
27. juli 2005 - 18:30 #3
Det er netop derfor at jeg vil merge løkkerne - det ser vsært at sammenligne med
værdier fra gennemløb af den forrige løkke.
Avatar billede smsng Nybegynder
28. juli 2005 - 10:15 #4
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?
Avatar billede Syska Mester
02. august 2005 - 07:38 #5
lytter lige med
Avatar billede thread Nybegynder
06. august 2005 - 12:31 #6
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 }
}
Avatar billede smsng Nybegynder
07. august 2005 - 13:36 #7
Mange tak. Det havde jeg ikke lige tænkt over.
Bare send et svar :-)
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