LINQ for Objekter med C#

Størrelse: px
Starte visningen fra side:

Download "LINQ for Objekter med C#"

Transkript

1 Denne guide er oprindeligt udgivet på Eksperten.dk LINQ for Objekter med C# LINQ er den store nye teknologi med.net 3.5. Der er i virkeligheden tale om en familie af teknologier som deler et fælles fundament - LINQ for Objekter. Artiklen gennemgår bl.a. alle de mange LINQ operatorer med eksempler. Skrevet den 06. Feb 2009 af nielle I kategorien Programmering / C# Indledning LINQ er en forkortelse af Language INtegrated Query. Altså noget med at skrive forespørgelser eller søgninger (querys) direkte som en del af programmeringssprogets syntaks. Det er indført med den nyligt udgivne.net 3.5. Sproget er her f.eks. C# eller VB.NET. Artiklens eksempler er skrevet i C#, men syntaksen ligner meget den du finder i VB.NET. I virkeligheden er LINQ en familie af teknologier som baserer sig på et fælles fundament: LINQ for Objekter, LINQ for DataSet, LINQ for SQL og LINQ for XML. Det er endda muligt at udvide med sin egen LINQ for Noget - hvis man har en passende "Noget" at gøre det for :^) LINQ for Objekter, som denne artikel altså handler om, er på mange måder lig med det omtalte fælles fundament. De andre LINQ teknologier tilføjer så "blot" nye elementer til fundamentet. En stor del af fundamentet består af de såkaldte LINQ operatorer og de vil derfor dominere artiklens sidste 3/4-del. Helt basalt set drejer LINQ sig om at løbe igennem, søge i og generelt at manipulere med sekvenser af "et eller andet". I LINQ for Objekter handler det om arrays og f.eks. i LINQ for SQL handler det om rækker fra en eller flere tabeller i en database. I det følgende vil jeg bruge ordet sekvens om "et eller andet" som har en indbygget naturlig rækkefølge. Det kunne være et array som gennemløbes et element ad gangen, det kunne være en streng som gennemløbes bogstav for bogstav, en tabel i et DataSet, en List<type>, en ArrayList, en tabel i en database eller noget helt syvende. v. 1.0: 26/02/ Første version. Davs LINQ Lad mig lægge ud med et eksempel: using System; using System.Collections.Generic; using System.Linq; namespace LinqToObjects class Program

2 static void Main(string[] args) string[] landarr = "Danmark", "Sverige", "Norge", "Island", "Finland", "Tyskland" ; "land" IEnumerable<string> landquery = landarr.where(l => l.endswith("land")) // Kun lande som slutter med.orderby(l => l); // Sorteret i stigende alfabetisk orden. foreach (string land in landquery) Console.WriteLine(land); Resultat: Finland, Island og Tyskland. Den centrale stump kode er dette: IEnumerable<string> landquery = landarr.where(l => l.endswith("land")).orderby(l => l); Koden er delt over flere linjer for at gøre det mere tydeligt hvad der egentlig foregår (det er typisk at LINQ eksempler vises på den måde :^). Samlet på én linje er det: IEnumerable<string> landquery = landarr.where(l => l.endswith("land")).orderby(l => l); Selve skrivemåden kaldes for extension method syntax (eller lambda query syntax) fordi der er gjort brug af extension metoder og lambda udtryk. Men mere om det lige om lidt. Alternativt kan der skrives i query comprehension syntax, som ser sådan ud: IEnumerable<string> landquery = from l in landarr where l.endswith("land") // Kun lande som... orderby l // Sorteret i stigende alfabetisk orden. select l;

3 Man kan på ingen måder sige at den ene syntaks er at foretrække frem for den anden. Extension method syntax er måske lidt voluminøs når eksemplerne bare bliver en smule mere kompliceret, men den har til gengæld også en hel del metoder, som ikke er til stede i query comprehension syntax. Omvendt er query comprehension syntax mere kompakt, generelt lettere at læse og man ser desuden tydeligt hvordan den er inspireret af SQL. Heldigvis udelukker de ikke hinanden, og man kan endda kombinere dem i noget vi kunne kalde for mikset syntaks: 2 ; int[] nogletal = 1, 7, 3, 9, 4, 7, 4, 8, 7, 43, 32, 9, 0, 0, 34, IEnumerable<int> query = (from t in nogletal where t < 20 orderby t select t).distinct(); foreach (int tal in query) Console.WriteLine(tal); Resultat: 0, 1, 2, 3, 4, 7, 8 og 9. Lambda udtryk I Where()-leddet fra før, så vi denne dims: l => l.endswith("land") Dette kaldes for et lambda udtryk (engelsk: lambda expression) og er indført med C# 3.0. Den primære grund var faktisk netop at bane vejen for LINQ. Hvordan skal dimsen læses? Where() forventer i dette tilfælde at man levere et string-objekt (navnet på et land) og at der returneres en boolsk værdi (om det ender på "land" eller ej). Man kan udspecificere dette ved at sige at den kræver en delegate med følgende signatur: delegate bool EnderPåLandDelegate(string l); Indførelsen af de anonyme metoder i C# 2.0 var egentlig blot et mellemstadie til indførelsen af lambda udtrykkene: C# Navngivne metoder: En delegate (f.eks. en event-handler) skulle i C# 1.0 assignes med en metode man havde oprettet et andet sted i koden: EnderPåLandDelegate c1 =

4 EnderPåLand; static public bool EnderPåLand(string l) return l.endswith("land"); Dette var lidt omstændigt - specielt hvis funktionen faktisk kun skulle bruges til det ene formål. Derfor de anonyme udtryk med C# 2.0: C# Anonyme metoder: Med indførelsen af anonyme metoder kunne man i stedet definere metoden i samme linje hvor den assignes til delegaten: EnderPåLandDelegate c2 = delegate(string l) return l.endswith("land"); ; C# Lambda udtryk: Med lambda udtryk er syntaksen blevet gjort endnu mere kompakt: EnderPåLandDelegate c3 = (string l) => l.endswith("land"); eller blot: DanskSprogetFilmDelegate c3 = l => l.endswith("land"); idet C# slutter sig til typen af argumentet, l (for land), via sammenhængen som den bruges i. Extension metoder Extension metoder er en anden ny ting med.net 3.5. De gør det muligt at udvide en eksisterende type med metoder som den ikke har i forvejen - og det helt uden at man behøver at lave den om. De implementeres som statiske metoder i en statisk hjælpe-klasse. Her er et eksempel som laver et relativ simpelt primtalstjek: static class NumberTheory public static bool IsPrime(this int tal) // Læg mærke til "this" if (tal < 2) return false;

5 for (int divisor = 2; divisor <= Math.Sqrt(tal); divisor++) if (tal % divisor == 0) return false; return true; Med denne på plads kan man skrive: int t = 3; Console.WriteLine("Tallet 0 er et primtal: 1", t, NumberTheory.IsPrime(t)); eller blot (og netop dét er så det nye): Console.WriteLine("Tallet 0 er et primtal: 1", t, t.isprime()); Og det er ikke en gang nødvendigt at angive typen siden at C# kan slutte sig til den ud fra sammenhængen: Console.WriteLine("Tallet 0 er et primtal: 1", 4, 4.IsPrime()); Med denne på plads, kan vi filtrere på en talserie for primtal: int[] tal = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ; IEnumerable<int> primtal = tal.where(t => t.isprime()); foreach (int t in primtal) Console.WriteLine(t); Resultat: 2, 3, 5 og 7. En lidt mere avanceret måde at opnå det samme er ved at tilføje følgende til NumberTheory-klassen:

6 public static IEnumerable<int> PrimeFilter(this IEnumerable<int> talserie) foreach (int tal in talserie) if (tal.isprime()) yield return tal; Vi kan så skrive: IEnumerable<int> primtal = tal.primefilter(); foreach (int t in primtal) Console.WriteLine(t); LINQ operatorerne fra ovenfor, While() og OrderBy(), er i virkeligheden implementeret som extension metoder på nogenlunde denne facon. LINQ operatorer While() og OrderBy() er kun et par af de rimeligt mange LINQ operatorer der findes. I det følgende vil jeg beskrive de enkelte funktioner og hvordan man bruger dem. Eksemplerne er primært i extension method syntax, men i de tilfælde hvor at det er muligt at gøre det tilsvarende i query comprehension syntax er denne også angivet. Eksemplerne er med vilje holdt meget simple. Koden forsøger ikke at være genial eller blot snedig, men det skal den heller ikke være: Formålet er at demonstrere principperne. Operatorerne er opdelt i grupper sammen med andre funktioner af samme grundlæggende type. Restriktion / Filtrering Operatorer: Where, Take, TakeWhile, Skip, SkipWhile og Distinct. Disse operatorer udvælger de elementer fra sekvensen som fortsat skal være med. Where(betingelse): Udvælger alle de elementer som opfylder betingelsen. IEnumerable<string> landequery1 = landearr.where(l => l.contains("an"));

7 IEnumerable<string> landequery2 = from l in landearr where l.contains("an") select l; Resultat: Danmark, Island, Finland og Tyskland. Take(n): Udvælger de n første elementer af sekvensen og skipper resten. IEnumerable<string> landequery1 = landearr.take(2); //... findes ikke... Resultat: Danmark og Sverige. TakeWhile(betingelse): Tager elementerne indtil at betingelsen er falsk første gang. Skipper resten. IEnumerable<string> landequery1 = landearr.takewhile(l => l.length > 5); //... findes ikke... Resultat Danmark og Sverige. Skip(n): Springer over de første n elementer fra sekvensen, og beholder resten. IEnumerable<string> landequery1 = landearr.skip(4); //... findes ikke... Resultat: Finland og Tyskland. SkipWhile(betingelse): Springer over sekvensens elementer indtil at betingelsen er falsk første gang.

8 IEnumerable<string> landequery1 = landearr.skipwhile(l => l.length > 5); //... findes ikke... Resultat: Norge, Island, Finland og Tyskland. Distinct(): Fjerner dubletter fra sekvensen. "Island"; string[] landearr = "Danmark", "Sverige", "Norge", "Island", "Finland", "Tyskland", "Sverige", IEnumerable<string> landequery1 = landearr.distinct(); //... findes ikke... Resultat: Danmark, Sverige, Norge, Island, Finland og Tyskland. Projektering Operatorer: Select og SelectMany. Disse operatorer oversætter det fremsøgte fra en form til en anden. Select(oversætter): IEnumerable<string> landequery1 = landearr.select(l => l.toupper()); IEnumerable<string> landequery2 = from l in landearr select l.toupper(); Resultat: DANMARK, SVERIGE, NORGE, ISLAND, FINLAND og TYSKLAND. Et udtryk skrevet i query comprehension syntax skal altid startes med et from-led og afsluttes med et select-led. Der er dog intet i vejen for at bruge den trivielle select:

9 select l; En Select() vil altid være af formen et-element-ind-et-element-ud. SelectMany(oversætter): Hvor Select() altså er 1-til-1 så er SelectMany() 1-til-mange. char[] splitter = 'a' ; IEnumerable<string> landequery1 = landearr.selectmany(l => l.split(splitter)); IEnumerable<string> landequery2 = from l in landearr from ls in l.split(splitter) select ls; Resultat: D, nm, rk, Sverige, Norge, Isl, nd, Finl, nd, Tyskl og nd. Joining Operatorer: Join og GroupJoin. Før koden, må vi lige have noget passende data som vi kan joine på. Først et par structs som definerer hvordan data ser ud: struct PokerSpiller public readonly int id; public readonly string fornavn; public readonly string efternavn; public PokerSpiller(int id, string fornavn, string efternavn) this.id = id; this.fornavn = fornavn; this.efternavn = efternavn; struct PokerRunde public readonly int spillerid; public readonly float gevinst;

10 public PokerRunde(int spillerid, float gevinst) this.spillerid = spillerid; this.gevinst = gevinst; Derefter data for et "typisk" spil poker: PokerSpiller[] spillere = "Hickok"), "McCall"), "Cannary-Burke") ; new PokerSpiller(1, "James Butler", new PokerSpiller(2, "Jack", new PokerSpiller(3, "Martha Jane", PokerRunde[] runder = ; new PokerRunde(1, 200), new PokerRunde(2, 15), new PokerRunde(2, 135), new PokerRunde(1, 355), new PokerRunde(1, 502), new PokerRunde(13, 2) Læg mærke til at spilleren "Martha Jane" ikke har vundet noget, samt at der er en ukendt spiller med id 13. Der er i øvrigt heller ikke taget højde for at der er nogen som jo må have tabt. Join(): Denne operator parrer de to sekvenser på de elementer der er med i begge sekvenser. Det er det der kaldes for en INNER JOIN i SQL. sekvens". værdier. IEnumerable stat = spillere.join( // Første sekvens - "den indre runder, // Anden sekvens - "den ydre sekvens". s => s.id, r => r.spillerid, // Der joines på disse to (s, r) => new s.efternavn, r.gevinst // Resultatet. ); foreach (var post in stat) Console.WriteLine(post); Resultat:

11 efternavn = Hickok, gevinst = 200 efternavn = Hickok, gevinst = 355 efternavn = Hickok, gevinst = 502 efternavn = McCall, gevinst = 15 efternavn = McCall, gevinst = 135 Det lille "var" der sneg sig ind i eksemplet er et tilfælde af en anonym variabel. C# 3.0 tillader at man bruger var i stedet for at skulle definere klasser specielt til at tage imod mellemresultater. Var'en er dog stadig typestærk, og C# ved i dette tilfælde at den indeholder et string-felt som hedder "efternavn" og et float-felt som hedder "gevinst". Visse steder kan brugen af "var" simplificere koden og gøre den nemmere at læse. Generelt bør man dog forsøge at skrive "pæn" kode og ikke lade alt for meget være underforstået på denne måde. Var kan kun bruges for lokale variable - den kan f.eks. ikke bruges som returtype for en funktion. Samme eksempel, men denne gang i query comprehension syntax: IEnumerable stat = from s in spillere join r in runder on s.id equals r.spillerid select new s.efternavn, r.gevinst ; Personligt synes jeg at denne form er nemmere at læse. I modsætning til i SQL, hvor at det er ligegyldigt hvad der er på den ene og den anden side af "on" i join'en, så kan rækkefølgen ikke byttes om i LINQ. Det skal skrives på formen: IEnumerable query = from y in ydreseq join i in indreseq on y.aaa equals i.bbb select new y.aaa, y.bbb, i.ccc ; Jeg har ikke helt gennemskuet hvorfor at man kalder det for hhv. inner sequence og outer sequence i LINQ. Men det er for så vidt også lige meget. Det vigtigste er at man er klar over at der skelnes skarpt mellem de sekvenser der er på den ene side og på den anden side af en join. Martha Jane kommer slet ikke med og det er fordi at Join() fungere som en INNER JOIN - da hendes spillerid ikke optræder i listen over runder, bliver hun ikke nævnt. Ønsker man at have hende med alligevel, skal man have fat i GroupJoin() - denne svare til en LEFT OUTER JOIN: GroupJoin(): Denne operator parrer og gruppere de to sekvenser. For hvert element i den første sekvens (den ydre) dannes der en gruppe over de resultater i den anden sekvens (den indre). sekvens". var stat = spillere.groupjoin( // Første sekvens - "den indre runder, // Anden sekvens - "den ydre sekvens".

12 værdier. s => s.id, r => r.spillerid, // Der joines på disse to (s, rundegrp) => new s.efternavn, rundegrp // Resultatet. ); var stat = from s in spillere join r in runder on s.id equals r.spillerid into rundegrp select new s.efternavn, rundegrp ; // Udskrivning foreach (var post in stat) Console.WriteLine(post.efterNavn); foreach (PokerRunde runde in post.rundegrp) Console.WriteLine("\t" + runde.gevinst); Resultat: Hickok McCall Cannary-Burke Ordning / Sortering Operatorer: OrderBy, OrderByDecending, ThenBy, ThenByDecending og Reverse. Disse operatorer ordner sekvensen ifølge den valgte sorterings-funktion. OrderBy(sortering): Sortere sekvensens elementer i stigende orden efter sorterings-funktionen. IEnumerable<string> landequery1 = landearr.orderby(l => l.length); IEnumerable<string> landequery2 = from l in landearr orderby l.length select l;

13 Resultat: Norge, Island, Danmark, Sverige, Finland og Tyskland. OrderByDecending(sortering): Sortere sekvensen i faldende orden efter sorterings-funktioen. IEnumerable<string> landequery1 = landearr.orderbydescending(l => l.length); IEnumerable<string> landequery2 = from l in landearr orderby l.length descending select l; Resultat: Tyskland, Danmark, Sverige, Finland, Island og Norge. Man kan vælge at tilføje et "ascending" i OrderBy() eksemplet. Imidlertid er det default opførelse at der skal sorteres i stigende orden så det er normalt ikke nødvendigt. Af samme årsag er "decending" obligatorisk hvis sorteringen skal være faldende i stedet for stigende. ThenBy(sekundær sortering): Denne skal altid bruges sammen med OrderBy() eller OrderByDecending(). Den angiver en sekundær sortering efter at der er sorteret for første gang: IEnumerable<string> landequery1 = landearr.orderby(l => l.length) // Sorter efter længde....thenby(l => l); //...dernæst alfabetisk IEnumerable<string> landequery2 = from l in landearr orderby l.length, l select l; Resultat: Norge, Island, Danmark, Finland, Sverige og Tyskland. ThenByDecending(sekundær sortering): fungere på samme måde, blot efter faldende sortering. Reverse(): Sortere sekvensen i modsat rækkefølge. IEnumerable<string> landequery1 = landearr.reverse(); //... findes ikke...

14 Resultat: Tyskland, Finland, Island, Norge, Sverige og Danmark. Gruppering Operator: GroupBy (det er den eneste i denne gruppe - GroupJoin() hører ikke med her). GroupBy(gruppering): Denne grupperer sekvensens elementer i 1 eller flere grupper; en gruppe for hver mulig værdi af grupperings-funktionen. IEnumerable<IGrouping<int, string>> landequery1 = landearr.groupby(l => l.length); landearr l.length; IEnumerable<IGrouping<int, string>> landequery2 = from l in group l by foreach (IGrouping<int, string> group in landequery1) Console.WriteLine("Lande med 0 bogstaver:", group.key); foreach (string land in group) Console.WriteLine("\t0", land); Resultat: Lande med 7 bogstaver: Danmark Sverige Finland Lande med 5 bogstaver: Norge Lande med 6 bogstaver: Island Lande med 8 bogstaver: Tyskland Og i stigende rækkefølge: IEnumerable<IGrouping<int, string>> landequery1 = landearr.orderby(l => l.length).groupby(l => l.length); IEnumerable<IGrouping<int, string>> landequery2 = from l in

15 landearr l.length; orderby l.length group l by Mængder (engelsk: set) Operatorer: Concat, Union, Intersect og Except. Disse operatorer tager to sekvenser og kombinere dem f.eks. til deres fællesmængde. Concat(sekvens #2): Kombinere sekvens #1 med sekvens#2. Eventuelle dubletter beholdes. int[] primtal = 2, 3, 5, 7, 11, 13, 17, 19, 23 ; int[] fibonacci = 1, 1, 2, 3, 5, 8, 13, 21 ; IEnumerable<int> query = primtal.concat(fibonacci); foreach (int tal in query) Console.WriteLine(tal); Resultat: 2, 3, 5, 7, 11, 13, 17, 19, 23, 1, 1, 2, 3, 5, 8, 13 og 21. Union(sekvens #2): Kombinere sekvens #1 og #2 til deres foreningsmængde. Eventuelle dubletter smides væk. IEnumerable<int> query = primtal.union(fibonacci); foreach (int tal in query) Console.WriteLine(tal); Resultat: 2, 3, 5, 7, 11, 13, 17, 19, 23, 1, 8 og 21. Intersect(sekvens #2): Tager fællesmængden af de to sekvenser. Beholder udelukkende de elementer som er med i begge sekvenser. IEnumerable<int> query = primtal.intersect(fibonacci); foreach (int tal in query) Console.WriteLine(tal); Resultat: 2, 3, 5 og 13. Except(sekvens #2): Beholder de elementer i sekvens #1 som ikke er til stede i sekvens #2. Kaldes for deres komplementærmængde.

16 IEnumerable<int> query = primtal.except(fibonacci); foreach (int tal in query) Console.WriteLine(tal); Resultat: 7, 11, 17, 19 og 23. Man kunne mene at Empty() operatoren, som behandles til sidst i denne artikel, faktisk burde være inkluderet i blandt mængde-operatorerne. Men det er den traditionelt ikke.. Konvertering Operatorer: OfType, Cast, ToArray, ToList, ToDictionary, ToLookup, AsEnumerable og AsQueryable. Disse operatorer ændrer sekvensens elementer fra en type til en anden. OfType<type>: Acceptere en ikke-typet sekvens og konvertere den til en typet sekvens. Hvis der er elementer som ikke kan castes til den ønskede type, smides de bort. ArrayList ugeneriskheld = new ArrayList(); ugeneriskheld.add(7); ugeneriskheld.add(9); ugeneriskheld.add(13); ugeneriskheld.add("sort kat"); // Ignoreres senere. IEnumerable<int> generiskheld = ugeneriskheld.oftype<int>(); foreach (int forheld in generiskheld) Console.WriteLine(forHeld); Resultat: 7, 9 og 13. Cast<type>: Som OfType() men kaster en exception ved det første element som ikke kan castes til den ønskede type. senere. ArrayList ugeneriskheld = new ArrayList(); ugeneriskheld.add(7); ugeneriskheld.add(9); ugeneriskheld.add(13); ugeneriskheld.add("sort kat"); // Resultere i en exception IEnumerable<int> generiskheld = ugeneriskheld.cast<int>(); foreach (int forheld in generiskheld) Console.WriteLine(forHeld);

17 Resultat: 7, 9, 13 og så en InvalidCastException. ToArray<type>: Konvertere sekvensen til et array af den angivne type. int[] arrayheld = ugeneriskheld.oftype<int>().toarray<int>(); foreach (int forheld in arrayheld) Console.WriteLine(forHeld); ToList<type>: Som ToArray(), men returnere i stedet en liste. List<int> listheld = ugeneriskheld.oftype<int>().tolist<int>(); foreach (int forheld in listheld) Console.WriteLine(forHeld); For beskrivelser af ToDictionary() og ToLookup() vil jeg henvise til dokumentationen. De bruges ikke direkte så tit og er måske nok mere beregnet til intern brug i LINQ motoren. AsEnumerable og AsQueryable: I eksemplerne i denne artikel er der brugt IEnumerable fordi at dette er det interface som definerer alle LINQ operatorerne. Bevæger man sig over i LINQ for SQL bruges der imidlertid IQueryable. Denne arver fra IEnumerable og overstyre mange af metoderne i denne - dvs. at LINQ operatorerne kan opføre sig en smule anderledes alt efter om sekvensen er af er den ene eller anden type. AsEnumerable og AsQueryable bruges til at caste frem og tilbage mellem de to - for dermed at tvinge LINQ motoren til at bruge den ene eller anden variant. Element-operatorer Operatorer: First, FirstOrDefault, Last, LastOrDefault, Single, SingleOrDefault, ElementAt, ElementAtOrDefault og DefaultIfEmpty. Disse operatorer udvælger et enkelt element fra sekvensen. Hvis der ikke er noget element som opfylder kriteriet vil der normalt blive smidt en exception. Dette kan undgås ved at vælge en af Default-varianterne. Hvad der eksakt er "default" afhænger af typen. I det følgende er typen en System.Int32 (int) og der er default lig med 0. Hvis det f.eks. er en System.String ville default være null i stedet. Hvis der er mere end ét element i sekvensen som opfylder udvælgelses kriteriet vil der også blive smidt en exception. First(betingelse) og FirstOrDefault(betingelse): Udvælger det første element fra sekvensen som opfylder betingelsen.

18 int[] primtal = 2, 3, 5, 7, 11, 13, 17, 19, 23 ; exception. Console.WriteLine(primtal.First()); // 2 Console.WriteLine(primtal.First(p => p >= 10)); // 11 // Console.WriteLine(primtal.First(p => p >= 100)); - Kaster en Console.WriteLine(primtal.FirstOrDefault(p => p >= 100)); // 0 Last(betingelse) og LastOrDefault(betingelse): Som First(), men tager i stedet det sidste element fra sekvensen som opfylder betingelsen. exception. Console.WriteLine(primtal.Last()); // 23 Console.WriteLine(primtal.Last(p => p <= 10)); // 7 // Console.WriteLine(primtal.Last(p => p <= 1)); - Kaster en Console.WriteLine(primtal.LastOrDefault(p => p <= 1)); // 0 Single(betingelse) og SingleOrDefault(betingelse): Fungere egentlig som First() og Last(), men kræver at der er præcist et element som opfylder betingelsen. Console.WriteLine(primtal.Single(p => p % 2 == 0)); // 2 // Console.WriteLine(primtal.Single(p => 10 <= p && p <= 20)); - Kaster en exception. // Console.WriteLine(primtal.SingleOrDefault(p => 10 <= p && p <= 20)); - Kaster en exception. Console.WriteLine(primtal.SingleOrDefault(p => 10 <= p && p <= 12)); // 11 Console.WriteLine(primtal.SingleOrDefault(p => 8 <= p && p <= 10)); // 0 ElementAt(int): Returnere elementet ved det angivne indeks. exception. Console.WriteLine(primtal.ElementAt(5)); // 13 // Console.WriteLine(primtal.ElementAt(10)); - Kaster en Console.WriteLine(primtal.ElementAtOrDefault(10)); // 0 DefaultIfEmpty: Denne bruges til at sikre at der altid returneres et eller andet, hvis man starter med den tomme sekvens. Den er speciel nyttig i de tilfælde hvor at et mellemresultat giver en tom værdi.

19 // Til dem der ikke har vundet noget. PokerRunde defaultrunde = new PokerRunde(-1, 0); sekvens". værdier. // Extension Method Syntax var stat = spillere.groupjoin( // Første sekvens - "den indre runder, // Anden sekvens - "den ydre sekvens". s => s.id, r => r.spillerid, // Der joines på disse to (s, rundegrp) => new s.efternavn, rundegrp // Resultatet. ); foreach (var post in stat) Console.WriteLine(post.efterNavn); foreach (PokerRunde runde in post.rundegrp.defaultifempty(defaultrunde)) Console.WriteLine("\t" + runde.gevinst); Resultat: Hickok McCall Cannary-Burke 0 Aggregerings-operatore Operatorer: Count, LongCount, Min, Max, Sum, Average og Aggregate. Disse operatorer virker kun for sekvenser bestående af tal. De kan f.eks. bruges til at returnere summen af alle elementerne, eller at finde det største element. int[] primtalshuffle = 13, 23, 17, 3, 2, 11, 5, 7, 19 ; Console.WriteLine(primtalShuffle.Count()); // 9 (System.Int32) Console.WriteLine(primtalShuffle.LongCount()); // 9 (System.Int64) Console.WriteLine(primtalShuffle.Count(p => p >= 13)); // 4 Console.WriteLine(primtalShuffle.Min()); // 2 Console.WriteLine(primtalShuffle.Max()); // 23

20 Console.WriteLine(primtalShuffle.Max(p => 2 * p)); // 2*23 = 46 Console.WriteLine(primtalShuffle.Sum()); // 100 Console.WriteLine(primtalShuffle.Average()); // 11, Console.WriteLine( primtal.aggregate(1, (produkt, p) => produkt * p) // 1 * 13*23*17*...*19 = ); // Aggregate hed tidligere Fold Quantifier-operatore Operatorer: Contains, Any, All og SequenceEqual. Disse operatorer bruges til at teste om en given sekvens opfylder et ønsket kriterium. tallene Console.WriteLine(primtal.Contains(11)); // true - 11 er et at Console.WriteLine(primtal.Any(p => 10 < p && p < 12)); // true lige Console.WriteLine(primtal.All(p => p % 2 == 0)); // false - 2 er Console.WriteLine(primtal.SequenceEqual( // false primtalshuffle )); Console.WriteLine(primtal.SequenceEqual( // true primtalshuffle.orderby(p => p) )); Generator-operatorer Operatorer: Empty, Range og Repeat. Disse bruges til at oprette en sekvens. // Empty - opretter en tom sekvens: Console.WriteLine(Enumerable.Empty<int>().Count()); // 0 Console.WriteLine(Enumerable.Empty<int>() == null); // false Console.WriteLine(Enumerable.Empty<int>().SequenceEqual(new int[] )); // true

21 // Range - opretter et interval: foreach (int i in Enumerable.Range(3, 5)) Console.WriteLine(i); // 3, 4, 5, 6, 7 Console.WriteLine(Enumerable.Range(5, 3).SequenceEqual(new int[] 5, 6, 7 )); // true // Repeat: foreach (string s in Enumerable.Repeat<string>("abc", 3)) Console.WriteLine(s); // abc, abc, abc Efterord Man kan komme ret langt med LINQ uden at kende til detaljerne nedenunder motorhjelmen. Hvis man vil være ekspert skal man dog nok i bøgerne eller onlinehjælpen. Personligt vil jeg anbefale: C# 3.0 in a Nutshell O'Reilly 2007 Joseph Albahari & Ben Albahari ISBN: Specielt kapitlerne 8 som dækker LINQ generelt og 9 som dækker LINQ operatorerne..ooo. Pro LINQ Language Integrated Query in C# 2008 Apress Joseph C. Rattz, Jr. ISBN: Der er næppe noget som er værd at vide om LINQ som ikke er dækket af denne bog! Bogen indeholder masser af fornuftige kode eksempler. Han synes dog at have en forkærlighed for extension method syntax på bekostning af query comprehension syntax..ooo. 101 LINQ Samples: Eksemplerne bærer dog lidt præg af at de er skrevet før at LINQ blev endeligt frigivet med VS Kommentar af zapzone d. 22. Mar Umiddelbart ganske god artikkel. Har dog ikke nærlæst den.

22 Interesserede sjæle skulle nu tage et kig på SubSonic. Uden tvivl noget af det fedeste jeg har oplevet inden for.net... Super super nemt. Super super smart... :D :D Tjek det ud her: Jeg kan anbefalde deres web casts, for at få et hurtigt indblik i hvad det drejer sig om. Og det er altså ikke kun til Websites/web applications. Det egner sig lige så meget til winforms. Kommentar af dj-hupi d. 07. May Fin artikel, meget gennem arbejdet!

Introduktion til SQL queries

Introduktion til SQL queries Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til SQL queries Denne artikel beskriver nogle forskellige muligheder i SQL queries. Eksemplerne skulle gerne være standard SQL og virke i

Læs mere

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel: Denne guide er oprindeligt udgivet på Eksperten.dk SQL og ASP En artikel omkring simpel SQL og hvordan disse opbygges, udformes og udføres, sådan at man kan få et brugbart resultat i ASP. Dette ligefra

Læs mere

//Udskriver System.out.println("Hej " + ditfornavn + " " + ditefternavn + "."); System.out.println("Du er " + dinalder + " aar gammel!

//Udskriver System.out.println(Hej  + ditfornavn +   + ditefternavn + .); System.out.println(Du er  + dinalder +  aar gammel! Denne guide er oprindeligt udgivet på Eksperten.dk Brugerinput i Java Denne her artikel gennemgår diverse ting ved brug af brugerinput i Java. Den starter med det simple og fortæller derefter skridt for

Læs mere

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET.

Parameters. Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET. Denne guide er oprindeligt udgivet på Eksperten.dk Parameters Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til C# og ADO.NET. Der findes en tilsvarende artikel med

Læs mere

Tidligere gik denne i øvrigt under navnet DLINQ for Database LINQ, og man kan finde masse materiale om emnet under dette navn på Internettet.

Tidligere gik denne i øvrigt under navnet DLINQ for Database LINQ, og man kan finde masse materiale om emnet under dette navn på Internettet. Denne guide er oprindeligt udgivet på Eksperten.dk LINQ for SQL med C# LINQ for SQL er en af de nye teknologier med.net 3.5. Den gør det muligt at skrive (typesikre!) database søgninger direkte i programkoden

Læs mere

Hvad er Objekter - Programmering

Hvad er Objekter - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Hvad er Objekter - Programmering En rigtig god gennemgang af hvad objekter er! Hvordan de oprettes og anvendes! Det er helt klart til nybegyndere, som

Læs mere

Abstrakte datatyper C#-version

Abstrakte datatyper C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Abstrakte datatyper C#-version Finn Nordbjerg 1/9 Abstrakte Datatyper Denne note introducerer kort begrebet abstrakt datatype

Læs mere

Database for udviklere. Jan Lund Madsen PBS10107

Database for udviklere. Jan Lund Madsen PBS10107 Database for udviklere Jan Lund Madsen PBS10107 Indhold LINQ... 3 LINQ to SQL og Arkitektur... 3 O/R designere... 5 LINQ Den store introduktion med.net 3.5 er uden tvivl LINQ(udtales link): Language-INtegrated

Læs mere

Database design for begyndere

Database design for begyndere Denne guide er oprindeligt udgivet på Eksperten.dk Database design for begyndere Denne artikel beskriver hvordan man kommer fra ide til database design. Den stopper inden normal former. Den forudsætter

Læs mere

Singleton pattern i C#

Singleton pattern i C# Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i C# Denne artikel beskriver Singleton pattern og implementation i C#. Den forudsætter kendskab til C# men ikke til Singleton. Der er

Læs mere

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder.

I denne artikel vil vi bruge en User klasse som vi så vil gruppere på forskellige måder. Denne guide er oprindeligt udgivet på Eksperten.dk Collections i.net Når du kigger i namespacet System.Collections finder du over 10 forskellige klasser. At vælge den rigtige til netop din applikations

Læs mere

Anvendelse af metoder - Programmering

Anvendelse af metoder - Programmering Denne guide er oprindeligt udgivet på Eksperten.dk Anvendelse af metoder - Programmering En forhåbentlig rigtig god forklaring på hvad metoder er og hvordan de anvendes. Lidt om private og public, retur

Læs mere

Kontrol-strukturer i PHP

Kontrol-strukturer i PHP Denne guide er oprindeligt udgivet på Eksperten.dk Kontrol-strukturer i PHP Denne artikel gennemgår kontrolstrukturer i PHP. 'if', 'switch', 'while' og 'for' bliver gennemgået. Den forudsætter lidt grundlæggende

Læs mere

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#. Denne guide er oprindeligt udgivet på Eksperten.dk Brug af XML i C# Denne artikel vil vise lidt om hvordan man kan bruge XML i C#. Den forudsætter kendskab til XML og C# men ikke til brug af XML i C#.

Læs mere

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Note til Programmeringsteknologi Akademiuddannelsen i Informationsteknologi Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version Finn Nordbjerg 1/9 Indledning I det følgende introduceres et par abstrakte

Læs mere

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java Kursus i OOP og Java Kursus i Objektorienteret programmering i Java Åben Dokumentlicens Dette foredragsmateriale er under Åben Dokumentlicens (ÅDL) Du har derfor lov til frit at kopiere dette værk Bruger

Læs mere

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET

Skrevet den 18. Feb 2010 af arne_v I kategorien Programmering / Visual Basic.NET Denne guide er oprindeligt udgivet på Eksperten.dk Parameters Denne artikel beskriver hvorfor parameters er gode. Den forudsætter lidt kendskab til VB.NET og ADO.NET. Der findes en tilsvarende artikel

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4 DM502 Forelæsning 4 Flere kontrolstrukturer for-løkke switch-case Metoder Indhold Arrays og sortering af arrays String-funktioner for-løkke Ofte har man brug for at udføre det samme kode, for en sekvens

Læs mere

SQL for MySQL-begyndere

SQL for MySQL-begyndere Denne guide er oprindeligt udgivet på Eksperten.dk SQL for MySQL-begyndere I denne artikel vil jeg prøve at beskrive MySQL på begynderniveau. SQL står for Structured Query Language, og er et sprog til

Læs mere

Singleton pattern i Java

Singleton pattern i Java Denne guide er oprindeligt udgivet på Eksperten.dk Singleton pattern i Java Denne artikel beskriver Singleton pattern og implementation i Java. Den forudsætter kendskab til Java men ikke til Singleton.

Læs mere

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste

Som sagt kræves der helst lidt viden om OOP hvis man virkelig vil lærer noget, og ikke bare lave copypaste Denne guide er oprindeligt udgivet på Eksperten.dk Indkøbsvogn i PHP I denne artikel vil jeg prøve at lave en indkøbskurv som let kan udvides, og som ikke er svær at forstå. Det er bedst med viden om OOP(klasser),

Læs mere

Undtagelseshåndtering i C#

Undtagelseshåndtering i C# Denne guide er oprindeligt udgivet på Eksperten.dk Undtagelseshåndtering i C# I modsætning til C++ kan man i C# ikke skrive et program uden undtagelseshåndtering, så derfor har jeg skrevet denne guide

Læs mere

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API.

Den forudsætter kendskab til C++ og lidt kendskab til SQL og MySQL C API. Denne guide er oprindeligt udgivet på Eksperten.dk Brug af MySQL i C++ Denne artikel bygger ovenpå artiklen "MySQL C API" og forklarer hvordan man kan programmere mere objekt orienteret. Den forudsætter

Læs mere

At klippe en streng over på det mest hensigtsmæssige sted

At klippe en streng over på det mest hensigtsmæssige sted Denne guide er oprindeligt udgivet på Eksperten.dk At klippe en streng over på det mest hensigtsmæssige sted Formålet med denne artikel er at kaste lidt lys over, hvordan man klipper en streng over på

Læs mere

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation).

RMI introduktion. Denne artikel beskriver Java RMI (Remtote Method Invocation). Denne guide er oprindeligt udgivet på Eksperten.dk RMI introduktion Denne artikel beskriver Java RMI (Remtote Method Invocation). Den beskriver teorien bag RMI, viser et simpelt kode eksempel og forklarer

Læs mere

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java

Threads i Java. Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Denne guide er oprindeligt udgivet på Eksperten.dk Threads i Java Denne artikel giver en introduktion til threads i Java. Den beskriver hvad tråde er og forklarer hvordan de bruges i Java Den forudsætter

Læs mere

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen

Studiepraktik. Thomas Bøgholm Mikkel Hansen Jacob Elefsen Studiepraktik Thomas Bøgholm boegholm@cs.aau.dk Mikkel Hansen mhan@cs.aau.dk Jacob Elefsen jelefs12@student.aau.dk 1 Studiepraktik -- program Program onsdag 10.00 10.15 Registrering af fremmøde og gennemgang

Læs mere

Introduktion til funktioner, moduler og scopes i Python

Introduktion til funktioner, moduler og scopes i Python Denne guide er oprindeligt udgivet på Eksperten.dk Introduktion til funktioner, moduler og scopes i Python Denne artikel er fortsættelsen af "I gang med Python", som blevet publiceret her på sitet for

Læs mere

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form Database-sproget SQL SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form SELECT A1,, Ar FROM R1,, Rk WHERE B med attributter A1,, Ar relationer R1,, Rk betingelse B (logisk

Læs mere

Import af rekursivt (parent-child) hierarki i Palo

Import af rekursivt (parent-child) hierarki i Palo Import af rekursivt (parent-child) hierarki i Palo Dette dokument beskriver hvordan et simpelt rekursivt (parent-child) hierarki kan importeres ind i Palo på forskellige måder via SQL og samtidig bibeholde

Læs mere

Relationel Algebra og SQL

Relationel Algebra og SQL Relationel Algebra og SQL Indholdsfortegnelse Relationel Algebra og SQL...1 Indholdsfortegnelse...1 De oprindelige mængdeoperationer...2 1. UNION (foreningsmængde)...2 2. INTERSECTION (fællesmængde)...2

Læs mere

Den forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET.

Den forudsætter kendskab til XML og VB.NET men ikke til brug af XML i VB.NET. Denne guide er oprindeligt udgivet på Eksperten.dk Brug af XML i VB.NET Denne artikel vil vise lidt om hvordan man kan bruge XML i VB.NET. Den forudsætter kendskab til XML og VB.NET men ikke til brug af

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner Kan (ved simple tilretningerne) bruges til at implementere metoder, der gennemsøger en arrayliste (eller anden objektsamling) og finder objekter, der opfylder

Læs mere

Programmering for begyndere Lektion 2. Opsamling mm

Programmering for begyndere Lektion 2. Opsamling mm Lektion 2 Opsamling mm God tone Der er indlagt spørge sessioner Lektion 2 - Agenda Programmering for Lidt ændringer til teknikken, herunder hvordan du genser en lektion Lidt generelle tilbagemeldinger

Læs mere

Hvorfor skal vi bruge objekt orienteret databaser?

Hvorfor skal vi bruge objekt orienteret databaser? OODBMS Vs. RDBMS 1 Indholdsfortegnelse Hvorfor skal vi bruge objekt orienteret databaser?... 3 OODBMS i erhvervslivet... 4 Bagsiden af medaljen... 5 OODBMS i praksis... 6 Konklusion... 8 2 Hvorfor skal

Læs mere

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC.

Prepared Statements. Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC. Denne guide er oprindeligt udgivet på Eksperten.dk Prepared Statements Denne artikel beskriver hvorfor prepared statements er gode. Den forudsætter lidt kendskab til Java og JDBC. Skrevet den 18. Feb 2010

Læs mere

Bits, bit operationer, integers og floating point

Bits, bit operationer, integers og floating point Denne guide er oprindeligt udgivet på Eksperten.dk Bits, bit operationer, integers og floating point Denne artikel beskriver hvordan data gemmes som bits og hvordan man kan manipulere med bits. Den forudsætter

Læs mere

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections;

PROGRAM. using System; using System.Collections.Generic; using System.Text; using System.Collections; PROGRAM using System; using System.Collections.Generic; using System.Text; using System.Collections; namespace EventManager class Program static void Main(string[] args) string hovedmenu = ""; string svar;

Læs mere

Tredjepart webservices

Tredjepart webservices Tredjepart webservices 4. juni 2015 USS Dok. Klik her for at angive tekst. 1/12 Indholdsfortegnelse Introduktion... 3 Miljøer... 3 Adgang... 3 API kald... 4 GET: /authorizations... 4 Input 4 Output 4 Output

Læs mere

Dvs. at give dit program muligheden for at loade og bruge plugins som andre har lavet.

Dvs. at give dit program muligheden for at loade og bruge plugins som andre har lavet. Denne guide er oprindeligt udgivet på Eksperten.dk Refleksion med.net Refleksion bruges til at undersøge klasser på runtime tidspunktet. Se hvordan du f.eks. loader en klasse fra en DLL, gennemkigger dens

Læs mere

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form

Database-sproget SQL. SELECT A1,, Ar FROM R1,, Rk WHERE B med. SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form Database-sproget SQL SQL ~ SEQUEL ~ Structered English QUEry Language SQL-forespørgsel, generel form SELECT A1,, Ar FROM R1,, Rk WHERE B med attributter A1,, Ar relationer R1,, Rk betingelse B (logisk

Læs mere

Bemærk! Et PHP script har kun brug for at forbinde én gang til databaseserveren. Det kan så sagtens udføre flere kommandoer vha. denne forbindelse.

Bemærk! Et PHP script har kun brug for at forbinde én gang til databaseserveren. Det kan så sagtens udføre flere kommandoer vha. denne forbindelse. Mysqli Webintegrator Når vi arbejder med server-side scripting ( i vort tilfælde PHP), har vi ofte behov for at kunne tilgå data, som vi opbevarer i en database. Det kan f.eks. dreje sig om nyhederne i

Læs mere

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007 Opgavebesvarelsen skal afleveres som enten en printerudskrift eller som et passende dokument sendt via email til fjj@noea.dk. Besvarelsen skal

Læs mere

Databaseadgang fra Java

Databaseadgang fra Java Databaseadgang fra Java Grundlæggende Programmering med Projekt Peter Sestoft Fredag 2007-11-23 Relationsdatabasesystemer Der er mange databaseservere Microsoft Access del af Microsoft Office MySQL god,

Læs mere

Eksempel på en database: studenter, kurser, eksamener

Eksempel på en database: studenter, kurser, eksamener Udvidet Programmering 1999 Forelæsning 20, fredag 12. november 1999 Relationsdatabaser: relationer, tupler, attributter Forespørgselssproget SQL Databasesystemet PostgreSQL Tilgang til relationsdatabaser

Læs mere

Introduction til.net remoting i C#

Introduction til.net remoting i C# Denne guide er oprindeligt udgivet på Eksperten.dk Introduction til.net remoting i C# Denne artikel beskriver teorien bag.net remoting og viser nogle simple kode eksempler i C#. Den forudsætter kendskab

Læs mere

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017 Programmering og Problemløsning, 2017 Martin Elsman Department of Computer Science University of Copenhagen DIKU September 27, 2017 Martin Elsman (DIKU) Programmering og Problemløsning, 2017 September

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner findone, findall, findnoof, findsumof Primitive typer (forfremmelse og begrænsning) Identitet versus lighed (for objekter, herunder strenge) Opfølgning på Skildpadde

Læs mere

Software Construction 1 semester (SWC) Spørgsmål 1

Software Construction 1 semester (SWC) Spørgsmål 1 Spørgsmål 1 Objekter #1 Giv en kort præsentation af begrebet objekt, samt hvorledes du erklærer(declare), opretter(create) og bruger objekter Du kan beskrive o Datatyper o Variable / Instans variable /

Læs mere

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal.

I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal. Denne guide er oprindeligt udgivet på Eksperten.dk Afrund til helt tal I denne artikel vil du ved hjælp af arrays kunne afrunde et decimaltal til et helt tal. Skrevet den 03. Feb 2009 af tjomsen I kategorien

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 9 sider Skriftlig eksamen i Datalogi Modul 1 Vinter 1999/2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 5% Opgave 2

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3 DM502 Forelæsning 3 Indlæsning fra tastatur Udskrift til skærm Repetition Beregning af middelværdi Gentagelse med stop-betingelse (while) Heltalsdivision Division med nul Type-casting ( (double) ) Betinget

Læs mere

Java Klasse nedarvninger

Java Klasse nedarvninger Denne guide er oprindeligt udgivet på Eksperten.dk Java Klasse nedarvninger Et let lille overblik i hvordan klasse nedarvning virker i java Skrevet den 07. dec 2011 af mochners I kategorien Programmering

Læs mere

Send fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende fra Java.

Send  fra Java. Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende  fra Java. Denne guide er oprindeligt udgivet på Eksperten.dk Send email fra Java Denne artikel fortæller hvad man skal bruge og hvordan man skal kode for at sende email fra Java. Simple eksempler ikke noget vildt

Læs mere

Med register_globals = On får du automatisk adgang til en række variabelnavne i dit script.

Med register_globals = On får du automatisk adgang til en række variabelnavne i dit script. Denne guide er oprindeligt udgivet på Eksperten.dk Register Globals Off Lad os slå en ting fast med det samme - register_globals = Off er en god ting, i hvert fald set ud fra et sikkerhedsmæssigt synspunkt.

Læs mere

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen. Denne guide er oprindeligt udgivet på Eksperten.dk Grundlæggende PHP I denne artikel, vil der blive gennemgået de grundlæggende PHP-funktioner, såsom udskrift til skærmen, tid og dato og if-sætningen.

Læs mere

Programmering i C. Lektion 4. 5. december 2008

Programmering i C. Lektion 4. 5. december 2008 Programmering i C Lektion 4 5. december 2008 Funktioner Eksempel Fra sidst 1 Funktioner 2 Eksempel Funktioner Eksempel Eksempel: 1 / f u n k t i o n s p r o t o t y p e r / i n t i n d l a e s ( void )

Læs mere

Loginsystem (med MySQL)

Loginsystem (med MySQL) Denne guide er oprindeligt udgivet på Eksperten.dk Loginsystem (med MySQL) Dette er en guide til, hvordan man kan lave et loginsystem med php og muligvis også med sessioner og MySQL Skrevet den 02. Feb

Læs mere

Forelæsning Uge 2 Mandag

Forelæsning Uge 2 Mandag Forelæsning Uge 2 Mandag Sætninger Simple sætninger (assignment, interne og eksterne metodekald) Sammensatte sætninger (blok, selektion, gentagelse) Udtryk og operatorer Java syntax og style guide Afleveringsopgave:

Læs mere

Eksempel: Skat i år 2000

Eksempel: Skat i år 2000 Kursus 02199: Programmering afsnit 2.1-2.7 Anne Haxthausen IMM, DTU 1. Værdier og typer (bl.a. char, boolean, int, double) (afsnit 2.4) 2. Variable og konstanter (afsnit 2.3) 3. Sætninger (bl.a. assignments)

Læs mere

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Torsdag Forelæsning Uge 3 Torsdag Billedredigering (bl.a. brug af for-løkker) Gråtonebilleder (som er lidt simplere end farvebilleder) Arrays Kan "opbevare" et antal objekter (som ArrayList) Fast (på forhånd kendt)

Læs mere

Kursusarbejde 3 Grundlæggende Programmering

Kursusarbejde 3 Grundlæggende Programmering Kursusarbejde 3 Grundlæggende Programmering Arne Jørgensen, 300473-2919 klasse dm032-1a 21. november 2003 Indhold 1. Kode 2 1.1. forestillinger.h............................................. 2 1.2. forestillinger.cc.............................................

Læs mere

Derfor vil jeg bygge dette eksempel på een table hvor der kan tilkyttes personer til ALLE noder og der kan tilføjes et vilkårligt antal niveauer

Derfor vil jeg bygge dette eksempel på een table hvor der kan tilkyttes personer til ALLE noder og der kan tilføjes et vilkårligt antal niveauer Denne guide er oprindeligt udgivet på Eksperten.dk TreeView i Access II Jeg vil i denne anden udgave af treeview føljetonen begynde på et mere brugbart eksempel med et TreeView. Vi laver en ny database

Læs mere

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge.

Tilfældige tal. Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge. Denne guide er oprindeligt udgivet på Eksperten.dk Tilfældige tal Denne artikel introducerer generering af tilfældige tal og viser lidt om hvad man kan og ikke mindst hvad man ikke bør bruge. Den forudsætter

Læs mere

Skriftlig eksamen i Datalogi

Skriftlig eksamen i Datalogi Roskilde Universitetscenter side 1 af 11 sider Skriftlig eksamen i Datalogi Modul 1 Sommer 2000 Opgavesættet består af 6 opgaver, der ved bedømmelsen tillægges følgende vægte: Opgave 1 10% Opgave 2 10%

Læs mere

PHP Snippets. De små korte. Skrevet af Daniel Pedersen

PHP Snippets. De små korte. Skrevet af Daniel Pedersen PHP Snippets De små korte Skrevet af Daniel Pedersen Indhold PHP Snippets De små korte er en samling af små og praktiske kode eksempler med kort forklaring, som med formål at kunne benyttes til opsalgsværk

Læs mere

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere.

MySQL C API. Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere. Denne guide er oprindeligt udgivet på Eksperten.dk MySQL C API Denne artikel beskriver hvordan man bruger MySQL C API. Der er beskrivelse af build med forskellige compilere. Den forudsætter lidt kendskab

Læs mere

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree. Programmering 1999 Forelæsning 11, tirsdag 5. oktober 1999 Oversigt Klasse-hierarkier: superklasser og subklasser Nedarvning Polymorfi Programmering 1999 KVL Side 11-1 Hierarkier En klasse repræsenterer

Læs mere

Arrays i PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 04. Feb 2009 af taskmgr I kategorien Programmering / PHP

Arrays i PHP. Denne guide er oprindeligt udgivet på Eksperten.dk. Skrevet den 04. Feb 2009 af taskmgr I kategorien Programmering / PHP Denne guide er oprindeligt udgivet på Eksperten.dk Arrays i PHP De fleste som har skrevet omfattende scripts, er før eller siden stødt på problemet med at de bliver vanskelige at overskue hvis man bruger

Læs mere

Udvikling af DOTNET applikationer til MicroStation i C#

Udvikling af DOTNET applikationer til MicroStation i C# Udvikling af DOTNET applikationer til MicroStation i C# Praktiske tips for at komme i gang. Gunnar Jul Jensen, Cowi Hvorfor nu det? Mdl og Vba kan det hele Fordelene er : udviklingsmiljøet er eksternt

Læs mere

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater Design by Contract Bertrand Meyer 1986 Design and Programming by Contract Michael R. Hansen & Anne Haxthausen mrh@imm.dtu.dk Informatics and Mathematical Modelling Technical University of Denmark Design

Læs mere

Kapitel 4 Løkker i C#

Kapitel 4 Løkker i C# Kapitel 4 Løkker i C# Løkker en vigtig del af alle programmeringssprog, og C# er ikke andeles. En løkke er en måde at udføre en del af koden gentagne gange. Ideen er at du fortsætter med at udføre en opgave

Læs mere

SWC eksamens-spørgsmål. Oversigt

SWC eksamens-spørgsmål. Oversigt SWC eksamens-spørgsmål Oversigt #1 Typer og variable #2 Aritmetik og logik #3 Klasser (definition, objekter) #4 Klasser (metoder) #5 Klasser (nedarvning, polymorfi) #6 Conditional statements #7 Repetition

Læs mere

Delphi og Databaser for begyndere

Delphi og Databaser for begyndere Denne guide er oprindeligt udgivet på Eksperten.dk Delphi og Databaser for begyndere Denne artikel handler om hvordan man udnytter noget af det bedste i Delphi: Dets gode muligheder for integrering med

Læs mere

Register-databasen med.net

Register-databasen med.net Denne guide er oprindeligt udgivet på Eksperten.dk Register-databasen med.net Mange programmer gemmer deres konfiguration-data i register-database. Denne artikel viser hvordan du - f.eks. vha. C# - henter

Læs mere

Python programmering. Per Tøfting. MacFest

Python programmering. Per Tøfting. MacFest Python programmering MacFest 2005 Per Tøfting http://pertoefting.dk/macfest/ Indhold Måder at afvikle Python program på Variabler Data typer Tal Sekvenser Strenge Tupler Lister Dictionaries Kontrolstrukturer

Læs mere

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox

Martin Olsen. DM507 Projekt Del I. 19. marts 2012 FOTO: Colourbox Martin Olsen DM0 Projekt 0 Del I. marts 0 FOTO: Colourbox Indhold Indledning... Opgave... Opgave... Opgave... Opgave... Opgave... Opgave... Opgave... Kildekode til SimpleInv.java... Kildekode til MergeSort.java...

Læs mere

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999 sammenligninger, hvor Programmering 1999 Forelæsning 17, tirsdag 2 november 1999 Søgning efter en given værdi i en tabel Lineær søgning og binær søgning Effektivitet: maskinuafhængig vurdering af køretid

Læs mere

MapBasic &.NET interaktion. MapBasic.NET. Jakob Lanstorp IT konsulent COWI. Odense 23. Juni 2011. 1 8 jun 2011 MapBasic &.

MapBasic &.NET interaktion. MapBasic.NET. Jakob Lanstorp IT konsulent COWI. Odense 23. Juni 2011. 1 8 jun 2011 MapBasic &. MapBasic &.NET interaktion MapBasic.NET Jakob Lanstorp IT konsulent COWI Odense 23. Juni 2011 1 MapBasic &.NET interaktion Erfaring med MapBasic.NET / Visual Studio Anden programmering 2 Program Hurtig

Læs mere

Ratingsystem i PHP og MySQL

Ratingsystem i PHP og MySQL Denne guide er oprindeligt udgivet på Eksperten.dk Ratingsystem i PHP og MySQL Lær at lave et system til at vise rating/bedømmelse på artikler og nyheder. Skrevet den 03. Feb 2009 af virtual1ty I kategorien

Læs mere

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer

BRP Tal. Om computer-repræsentation og -manipulation. Logaritmer BRP 13.9.2006 Tal. Om computer-repræsentation og -manipulation. Logaritmer 1. Opgaverne til i dag dækker det meste af stoffet 2. Resten af stoffet logaritmer binære træer 3. Øvelse ny programmeringsopgave

Læs mere

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004

Videregående Programmering Obligatorisk opgave - 3. semester, efterår 2004 Overvågningssystem Beskrivelse Bagagesorteringssystemet består af et antal skranker (check-in) til modtagelse og registrering af bagage, et automatiseret sorteringsanlæg samt et antal terminaler (gates),

Læs mere

PHP 3 UGERS FORLØB PHP, MYSQL & SQL

PHP 3 UGERS FORLØB PHP, MYSQL & SQL PHP 3 UGERS FORLØB PHP, MYSQL & SQL Uge 1 & 2 Det basale: Det primære mål efter uge 1 og 2, er at få forståelse for hvordan AMP miljøet fungerer i praksis, og hvordan man bruger PHP kodesproget til at

Læs mere

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2 DM502 Forelæsning 2 Repetition Kompilere og køre Java program javac HelloWorld.java java HeloWorld.java Debugge Java program javac -g HelloWorld.java jswat Det basale Java program public class HelloWorld

Læs mere

Introduction til.net remoting i VB.NET

Introduction til.net remoting i VB.NET Denne guide er oprindeligt udgivet på Eksperten.dk Introduction til.net remoting i VB.NET Denne artikel beskriver teorien bag.net remoting og viser nogle simple kode eksempler i VB.NET. Den forudsætter

Læs mere

Gæstebog med validering opbygget med MySQL

Gæstebog med validering opbygget med MySQL Denne guide er oprindeligt udgivet på Eksperten.dk Gæstebog med validering opbygget med MySQL Dette er en simpel gæstebog, som kan hjælpe folk med at lave en velfungerende gæstebog uden alt for meget arbejde.

Læs mere

I mit script tager jeg højde for det problem ved, at gemme et unikt tal mellem 0-9 på 6 cifre og derved vil de så blive vist som 2 online.

I mit script tager jeg højde for det problem ved, at gemme et unikt tal mellem 0-9 på 6 cifre og derved vil de så blive vist som 2 online. Denne guide er oprindeligt udgivet på Eksperten.dk Hvem er online? Online script, som tager højde for at der kan være flere personer, som har den samme IP-adresse. Scriptet viser hvor lang tid brugeren

Læs mere

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Torsdag Forelæsning Uge 3 Torsdag Billedredigering Gråtonebilleder (som er lidt simplere end farvebilleder) Arrays Kan "opbevare" et antal objekter (som ArrayList) Fast (på forhånd kendt) antal elementer Afleveringsopgave:

Læs mere

Forelæsning Uge 6 Mandag

Forelæsning Uge 6 Mandag Forelæsning Uge 6 Mandag Tingene i denne forelæsning er ikke eksamenspensum Forelæsningen afrunder kurset, og forklarer nogle af de begreber, som I har mødt under kurset uden at få detaljeret forklaring

Læs mere

Forelæsning Uge 4 Mandag

Forelæsning Uge 4 Mandag Forelæsning Uge 4 Mandag Algoritmeskabeloner Kan (ved simple tilretningerne) bruges til at implementere metoder, der gennemsøger en arrayliste (eller anden objektsamling) og finder objekter, der opfylder

Læs mere

Appelsiner, bananer og citroner

Appelsiner, bananer og citroner Appelsiner, bananer og citroner Af: Peter Kellberg Danmarks Statistik Sejrøgade DK-00 København Ø pke@dstdk SAS og øvrige SAS Institute Inc-produkter samt navngivne serviceydelser er registrerede varemærker

Læs mere

ODIN-webservice ændringer release 2010 v2.0

ODIN-webservice ændringer release 2010 v2.0 DOKUMENTATION OG VEJLEDNING ODIN-webservice ændringer release 2010 v2.0 Indholdsfortegnelse 1. Nye webservice metoder... 2 1.1 Anvendelse af køretøjer og personel fra fremmede beredskaber ifm. indberetning

Læs mere

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13

Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Makrosikkerhed (Sikkerhedsindstillinger)...13 1 Indholdsfortegnelse Forord...8 Makroer samt aktivere Udvikler-fanen...10 Hvad er en makro... 10 Hvad kan du bruge en makro til... 10 Hvad en makro er (Visual Basic for Applications)... 11 Det hele sker

Læs mere

Løsning af møntproblemet

Løsning af møntproblemet Løsning af møntproblemet Keld Helsgaun RUC, oktober 1999 Antag at tilstandene i problemet (stillingerne) er repræsenteret ved objekter af klassen State. Vi kan da finde en kortest mulig løsning af problemet

Læs mere

Introduktion til SQL

Introduktion til SQL Introduktion til SQL Introduktion til SQL 1. udgave, 1. oplag 2013 Copyright 2013 Libris Media A/S Forfatter: Bobby Henningsen Forlagsredaktion: Peter Wiwe og Louise Peulicke Larsen Omslag: Louise Peulicke

Læs mere

Greenfoot En kort introduktion til Programmering og Objekt-Orientering

Greenfoot En kort introduktion til Programmering og Objekt-Orientering Greenfoot En kort introduktion til Programmering og Objekt-Orientering Greenfoot er et computer-program, som kan benyttes til at skrive andre computer-programmer, i et programmeringssprog kaldet Java.

Læs mere

DANMARKS TEKNISKE UNIVERSITET

DANMARKS TEKNISKE UNIVERSITET DANMARKS TEKNISKE UNIVERSITET Skriftlig prøve, 14. december 2018, 4 timer Side 1 af 18 Kursus navn: 02101 Indledende Programmering Kursus : 02101 Tilladte hjælpemidler: Ikke-digitale skriftlige hjælpemidler

Læs mere

Koden i denne guide vil kun virke i Flash MX 2003 og MX ikke ældre versioner!

Koden i denne guide vil kun virke i Flash MX 2003 og MX ikke ældre versioner! Denne guide er oprindeligt udgivet på Eksperten.dk Slideshow - Guide Denne guide gennemgår grundigt og forklarende hvordan man i Flash laver et slideshow med simpel fade-effekt med billeder hentet dynamisk.

Læs mere

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1. Programmering 1999 Forelæsning 4, fredag 10. september 1999 Klasser og objekter Felter, konstruktorer, this Eksempler på klasser: Time, Appointment Eksempler på metoder i Time og Appointment Klassefelter:

Læs mere

VS 2010 og.net framework 4.0

VS 2010 og.net framework 4.0 VS 2010 og.net framework 4.0 Captator Tlf: 8620 4242 www.captator.dk Henrik Lykke Nielsen Softwarearkitekt, Microsoft Regional Director for Denmark lykke@captator.dk Mobil: 2237 3311 maj 2010 VS 2010 og.net

Læs mere