Csharp/Løkker

(Omdirigert fra «Csharp/Kapittel10»)

Løkker

rediger

Ofte vil man utføre en rekke instruksjoner flere ganger, dette kan generelt gjøres på tre måter, for, foreach og while.

for løkker utfører instruksjoner helt til et uttrykk blir false, den tar 3 "parameter" (egentlig instruksjoner, det er derfor de er adskilt med semikolon, og ikke komma)

for([initsialisering];[uttrykk];[uttrykk])
{
}

generelt brukes denne til å gå igjennom en liste eller array

for(int x = 1; x <= 100; x++)
{
  Console.WriteLine(x.ToString());
}

Denne funksjonen vil telle fra 1 til 100, og skrive det i console vinduet. En løkke kan avsluttes med nøkkelordet break. Nøkkelordet continue får løkken til å sjekke, og starte på nytt. Man kan ha flere uttrykk i hver del ved å skille dem med komma.

Foreach

rediger

foreach er en løkke funksjon, som går igjennom alle objekter i en mengde. (array, collection eller lignende) Dette gjør at du slipper telleren i for, hvis man egentlig ikke trenger den. foreach sin syntaks er ganske enkel, den starter med nøkkelordet foreach etterfulgt av parentes, som inneholder en variabel deklarasjon, etterfulgt av nøkkelordet in etterfulgt av mengden man vil gå igjennom

foreach(object obj in collection)
{
}

Innenfor kodeblokken, kan man bruke obj som en vanlig variabel. Et eksempel, ville vært en array med string, som skal skrives til consolen.

string[] names = new string[] {"Anders Andersen", "Børre Børresen", "Silje Olsen", "Fredrik Hansen", "Julie Sørensen", "Lise Andersen"};
foreach(string name in names)
 Console.WriteLine(name);

Man kan ikke slette, eller legge til objekter i en collection, mens en forach jobber på den, dette vil føre til en exception. Måten å gjøre det på, er å legge alle som skal slettes, inn i en ny collection, og deretter slette alle i den nye fra den gamle, etter foreach er ferdig.

List‹string› names = new List‹string›(new string[] {"Anders Andersen", "Børre Børresen", "Silje Olsen", "Fredrik Hansen", "Julie Sørensen", "Lise Andersen"} );
List‹string› delete_these = new List<string>();
foreach(string name in names)
{
  if(name.StartsWidth("John"))
    delete_these.Add(name);
  else
    Console.WriteLine(name);
}
foreach(string name in delete_this)
  names.Remove(name);

while tar et parameter av typen bool, og vil utføre alle funksjoner helt til det parameter blir satt til false.

bool app_running = true;
while(app_running)
{
  Console.WriteLine("Hello World!");
  app_running = false;
}

Dette vil lage en løkke som kun utføres én gang.

En løkke kan avsluttes med nøkkelordet break. Nøkkelordet continue får løkken til å sjekke, og starte på nytt.

Iteratorer

rediger

Iteratorer er objekter som støtter enumeration, dvs. funksjonalitet via metoder for å gå gjennom en sekvens med verdier fra et objekt som implementerer IEnumerable-grensesnittet. Foreach-kommandoen er den vanligste måten å bruke dem på.

Genererte iteratorer med Yield-nøkkelordet

rediger

yield-nøkkelordet er et nokså unikt tillegg til C# 2.0 og forenkler i stor grad skapelsen av iteratorer. Når en bruker yield return, vil koden fortsette å kjøre fra det punktet etter neste verdi er anmodet (via MoveNext), ulikt return som returnerer umiddelbart. En indikererer at sekvensen er ferdig via yield break-uttrykket.

using System.Collections.Generic;
using System;

public class YieldSample {
  static IEnumerable<DateTime> GenerateTimes()
  {
    DateTime limit = DateTime.Now + new TimeSpan(0,0,30);
    while (DateTime.Now < limit) yield return DateTime.Now;
    yield break;
  }

  static void Main()
  {
    foreach (DateTime d in GenerateTimes())
    {
      System.Console.WriteLine(d);
      System.Console.Read();
    }
  }
}

Bemerk at du definerer funksjonens returtype til en generisk System.Collections.Generic.IEnumerable, der datatypen i parameteren er den ønskede datatype av verdiene i sekvensen vi returnerer. I tillegg eksekveres kodeblokken til foreach-uttrykket innimellom yield return-uttrykkene.