Arrayer (vektorer) Murach s: kap 8 2013-01-15 1 Elektronikcentrum i Svängsta AB
Arrayer Arrayer (vektorer) Ofta i ett program har vi flera variabler av samma datatyp som är relaterade till varandra. Exempel Koordinater längs en sträcka mellan två punkter (tänk GPS med vägbeskrivning) Namn på personer som är medlemmar i en klubb Istället för att ha flera variabler kan vi använda oss av arrayer (även kallat vektorer). EC Utbildning AB 2013-01-15 2
Arrayer Arrayer (vektorer) En array är en variabel som just består av en samlig relaterad data. De har en definierad längd (storlek). När storleken bestämts går den ej att ändra. Deklaration av en array består av flera delar: datatype[] arrayname = new datatype[size]; datatype int, string, decimal etc.. Hakparenteser [] Visar att det är en array arrayname new size Namnet på arrayen (variabelnamet) Minne för arrayen allokeras (arrayer är klasser i.net) Antal element som ryms i arrayen EC Utbildning AB 2013-01-15 3
Arrayer Arrayer (vektorer) En vektor kan bestå av en eller flera dimensioner. Oftast är dessa en- eller tvådimensionella. Varje dimension kan bestå av ett eller flera element Index börjar på 0 första elementet i arrayen ligger på plats 0. Innehåller arrayen 3 element är således högsta index 2. Man kommer åt ett element genom att ange dess index inom hakparenteser [ ] //Endimenstionell vektor med 3 element int[] onedimarray = new int[3]; onedimarray[0] = 1; //första elementet - alltid på plats 0 onedimarray[1] = 2; onedimarray[2] = 3; //sista elementet - alltid 1 mindre än storleken på arrayen //Tvådimensionell vektor med (2 x 3) 6 element double[,] multiarray = new double[2, 3]; multiarray[0, 0] = 1.0; //första elementet multiarray[1, 2] = 6.0; //sista elementet EC Utbildning AB 2013-01-15 4
Arrayer Endimensionella arrayer och initiering Vanligast är att man arbetar med endimensionella vektorer. Vet man vilka värden som ska finnas i arrayen kan man tilldela dessa direkt. Dessa anges inom måsvingar {} och separerade med komma,. //Initiering på två rader string[] names; //deklaration names = new string[2]; //tilldelning med storlek (2) // Initiering med värden. Storleken beräknas automatiskt int[] intarray = { 1, 2, 3, 4 }; // Initiera med storlek. Värdena nollställs decimal[] prices = new decimal[2]; prices[0] = 2.7m; //första elementet prices[1] = 3.14m; //andra (sista) elementet EC Utbildning AB 2013-01-15 5
Arrayer Endimensionella arrayer Man kan tänka sig att en endimensionell array är som en lista. int[] array = {10, 9, 8, 7}; Index 0 1 2 3 Värde 10 9 8 7 array[1] = 6; array[3] = array[2]; Index 0 1 2 3 Värde 10 6 8 8 EC Utbildning AB 2013-01-15 6
Arrayer Tvådimensionella arrayer Arbetar man med två dimensioner används kommatecknet (,) för att separera på dimensionerna. Tvådimensionella arrayer kan visualiseras som en tabell där första dimensionen är raderna och andra dimensionen är kolumnerna. double[,] arrayname = new double[rows, columns]; EC Utbildning AB 2013-01-15 7
Arrayer Tvådimensionella arrayer För att komma åt ett element i arrayen behöver vi här ange båda dimensionerna // Skapa arrayen int[,] myarray = new int[2, 3]; //Första raden myarray[0, 0] = 1; myarray[0, 1] = 2; myarray[0, 2] = 3; //Andra raden myarray[1, 0] = 4; myarray[1, 1] = 5; myarray[1, 2] = 6; EC Utbildning AB 2013-01-15 8
Arrayer Tvådimensionella arrayer Värden nollställs vid initiering // Skapa arrayen int[,] myarray = new int[2, 3]; //Första raden myarray[0, 0] = 1; myarray[0, 1] = 2; myarray[0, 2] = 3; //Andra raden myarray[1, 0] = 4; myarray[1, 1] = 5; myarray[1, 2] = 6; Kolumn Rad 0 1 2 0 0 0 0 1 0 0 0 Kolumn Rad 0 1 2 0 1 2 3 1 4 5 6 EC Utbildning AB 2013-01-15 9
Arrayer Tvådimensionella arrayer Precis som med endimensionella arrayer kan tvådimensionella dito initieras med värden: // Initiera en 2 x 3-array med värden int[,] myarray = { { 1, 2, 3 }, //Rad 1 {4, 5, 6 } }; //Rad 2 EC Utbildning AB 2013-01-15 10
Arrayer Flerdimensionella arrayer Vanligtvis arbetar man med en eller två dimensioner i sina arrayer. Krävs fler än två dimensioner i din array är det samma tillvägagångssätt som med tvådimensionella arrayer det kräver bara utökning av dimensionerna: int[,,] threed = new int[2, 4, 8]; EC Utbildning AB 2013-01-15 11
Arbeta med arrayer 2013-01-15 12 Elektronikcentrum i Svängsta AB
Arbeta med arrayer Arrayers storlek När man hanterar arrayer är det viktigt att tänka på dess storlek. Anger du en indexposition utanför arrayens gränser kommer programmet med all sannolikhet att krascha! int[] array = new int[3]; array[0] = 1; array[1] = 2; array[2] = 3; // Skriver utanför arrayens gräns- // IndexOutOfRangeException kommer genereras array[3] = 4; Index 0 1 2??? Värde 1 2 3??? EC Utbildning AB 2013-01-15 13
Arbeta med arrayer Arrayers storlek För att ta reda på hur många element det finns i en array, eller specifik dimension i arrayen, finns följande metoder i tabellen nedan. Dessa är speciellt användbara tillsammans med loopar då man på ett enkelt sätt kan stega genom alla element Metod/Property Beskrivning Length Returnerar ett heltal (integer) som representerar antalet element för alla dimensioner i arrayen. En 4x4-array returnerar då 16. OBS returvärdet är antalet element i arrayen, inte det högsta indexvärdet! GetUpperBound(dim) Finn det största index-värdet i arrayen för vald dimension (skickas som parameter). Precis som vanligt index börjar man räkna på 0. EC Utbildning AB 2013-01-15 14
Arbeta med arrayer Arrayers storlek Exempel //Några produkters priser decimal[] prices = {10.9m, 23m, 139m, 59.9m,74.5m}; decimal subtotal = 0.0m; Console.WriteLine("Antal element: {0}", prices.length); Console.WriteLine("Högsta indexvärde: {0}", prices.getupperbound(0)); //Gå igenom alla element //Tänk på att Length alltid är 1 (ett) större än antalet element! for (int i = 0; i < prices.length; i++) { subtotal += prices[i]; Console.WriteLine("index {0}:\t{1:c}", i, prices[i]); } Console.WriteLine("Slutsumma:\t{0:c}", subtotal); Console.ReadLine(); Antal element: 5 Högsta indexvärde: 4 index 0: 10,90 kr index 1: 23,00 kr index 2: 139,00 kr index 3: 59,90 kr index 4: 74,50 kr Slutsumma: 307,30 kr EC Utbildning AB 2013-01-15 15
Arbeta med arrayer Foreach Att stega igenom en array (eller andra collections såsom List och Dictionary som förklaras senare) finns en dedikerad loop: foreach. foreach(datatype value in collection) { //gör någonting med value } EC Utbildning AB 2013-01-15 16
Arbeta med arrayer Foreach //Några produkter med priser decimal[] prices = { 10.9m, 23m, 139m, 59.9m, 74.5m }; decimal subtotal = 0.0m; //Gå igenom alla element foreach(decimal value in prices) { subtotal += value; Console.WriteLine("enhetspris:\t{0:c}", value); } Console.WriteLine("Slutsumma:\t{0:c}", subtotal); Console.ReadLine(); enhetspris: enhetspris: enhetspris: enhetspris: enhetspris: Slutsumma: 10,90 kr 23,00 kr 139,00 kr 59,90 kr 74,50 kr 307,30 kr EC Utbildning AB 2013-01-15 17
Arbeta med arrayer Foreach Vissa begränsningar finns där man måste använda en vanlig for-loop: Vi vill bara komma åt vissa element i samlingen, exempelvis element 10-15. Med foreach går vi igenom alla element. Vi vill uppdatera elementen. Uppbyggnaden av foreach gör det omöjligt att uppdatera värdetyper. Man behöver en for-loop för detta ändamål. EC Utbildning AB 2013-01-15 18
Arbeta med arrayer Statiska metoder på arrayer Det finns även två statiska metoder för array-klassen som är användbara. Då dessa metoder är statiska anropas de direkt på Array-klassen. Metod Beskrivning Clear(myArray, index, length) Nollställer de specificerade värdena mellan index och length element framåt. IndexOf(myArray, value) och LastIndexOf(myArray, value) Finn första respektive sista index-värdet för det specificerade värdet. Om värdet inte kunde hittar returneras -1 EC Utbildning AB 2013-01-15 19
Arbeta med arrayer Statiska metoder på arrayer // En array med dimensionerna 4x2 int[,] myarray = { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } }; //statisk method anropas direkt på Array! Array.Clear(myArray, 1, 4); 1 2 3 4 5 6 7 8 Array.Clear(myArray, 1, 4); 1 0 0 0 0 6 7 8 EC Utbildning AB 2013-01-15 20
Collections (samlingar) Murach s: kap 8 (från s. 232) 2013-01-15 21 Elektronikcentrum i Svängsta AB
Collections (samlingar) Collections En utökning av Arrayer är så kallade collections (samlingar). Till skillnad från arrayer, som har en fast storlek, kan collections variera antalet element i sig. Det är alltså möjligt att lägga till och ta bort element dynamiskt samlingen utökas automatiskt när det behövs. EC Utbildning AB 2013-01-15 22
Collections (samlingar) Collections De collectionklasser som man främst använder är generiska (eng. generic) Detta betyder att man anger, direkt efter typnamnet och innanför vinkelparenteser (<>), vilken datatyp samlingen ska innehålla. Man skriver ofta List<T> för att symbolisera att klassen är generisk. T står för Type. En lista som innehåller int definieras såhär: List<int> mylist = new List<int>(); EC Utbildning AB 2013-01-15 23
Collections (samlingar) Collections De vanligaste collectionklasserna är: Klass Beskrivning List<T> Fungerar ungefär som en array man kommer åt ett element via dess index. Dictionary<TKey,TValue> Liknar ett uppslagsverk man använder ett nyckelord, TKey, för att komma åt definitionen (alltså värdet), TValue. De kan vara av olika datatyper. Queue<T> Stack<T> En kö av typen FIFO (First In, First Out). Det som kommer först in i kön tas först ut. En stack (hög, stapel) av typen LIFO (Last In, First Out). Det som läggs överst på högen tas bort först. EC Utbildning AB 2013-01-15 24
Collections (samlingar) List<T> Den absolut vanligaste samlingsklassen är List<T> då den är ett bra substitut för vanliga arrayer. En List<T> kan alltså innehålla en datatyp dock kan olika List<T> innehålla olika datatyper: List<int> mylist = new List<int>(); List<string> names = new List<string>(); List<decimal> pricelist = new List<decimal>(); EC Utbildning AB 2013-01-15 25
Collections (samlingar) List<T> Vanligt förekommande metoder och properties i List<T>-klassen är: Metod/Property Beskrivning Count Add(object) Clear() Sort() Antalet element i listan, alltså samma värde som Length hos en array. Lägg till ett element i listan. Elementet lägger sig sist. Tömmer och nollställer listan. Sortera listan i stigande ordning (dvs. minsta värdet först) EC Utbildning AB 2013-01-15 26
Collections (samlingar) List<T> List<decimal> pricelist = new List<decimal>(); // Skapa listan // Lägg till värden pricelist.add(79.9m); pricelist.add(2.5m); pricelist.add(159.0m); pricelist.add(25.5m); Console.WriteLine("Det finns {0} element i listan", pricelist.count); Det finns 4 element i listan 79,90 kr 2,50 kr 159,00 kr 25,50 kr Uppdaterad och sorterad lista: 2,50 kr 25,50 kr 30,90 kr 79,90 kr Uppdaterad lista: Det finns 1 element i listan 10,50 kr // stega igenom alla element foreach (decimal price in pricelist) { Console.WriteLine(price.ToString("c")); } pricelist[2] = 30.90M; // uppdatera andra elementet pricelist.sort(); // sortera listan Console.WriteLine("\nUppdaterad och sorterad lista:"); foreach (decimal price in pricelist) { Console.WriteLine(price.ToString("c")); } pricelist.clear(); pricelist.add(10.5m); //Töm listan... //Och lägg till ett värde Console.WriteLine("\nUppdaterad lista:"); Console.WriteLine("Det finns {0} element i listan", pricelist.count); foreach (decimal price in pricelist) { Console.WriteLine(price.ToString("c")); } Console.ReadKey(); EC Utbildning AB 2013-01-15 27
Collections (samlingar) Dictionary<TKey, TValue> Ibland används två värden av olika datatyp ihop i ett par. Då är klassen Dictionary användbar då den sparar en nyckel som ger tillgång till ett värde. Exempel på tillämpningar kan vara Ett uppslagsverk (som namnet antyder) slå upp ett ord och du får en beskrivning Prislista en produkt är bunden till ett pris. EC Utbildning AB 2013-01-15 28
Collections (samlingar) Dictionary<TKey, TValue> Vanligt förekommande metoder och properties i Dictionary-klassen är (förutom de som nämnts om List): Metod/Property Add(TKey, TValue) Beskrivning Lägg till ett element-par. ContainsKey(TKey) Returnerar true om nyckeln finns i samlingen, false annars. ContainsValue(TValue) Returnerar true om värdet finns i samlingen, false annars. EC Utbildning AB 2013-01-15 29
Collections (samlingar) Dictionary<TKey, TValue> Dictionary<string, decimal> pricelist = new Dictionary<string, decimal>(); string product; decimal price; // Lägg till några produkter pricelist.add("potatis", 6.5m); pricelist.add("shampoo", 15m); pricelist.add("spagetti", 12m); product = "Spagetti"; //kolla så att nyckeln finns - //finns inte nyckeln kommer programmet krascha! if (pricelist.containskey(product)) { price = pricelist[product]; Console.WriteLine(product + " kostar " + price.tostring("c")); } else { Console.WriteLine("Kunde inte hitta produkten"); } Console.ReadLine(); Spagetti kostar 12,00 kr EC Utbildning AB 2013-01-15 30
Collections (samlingar) Collections utan typ Klassen ArrayList används för att, på samma sätt som en List<T>, samla ihop data. Skillnaden mellan ArrayList och List<T> är att ArrayList kan ta alla datatyper. Vi kan alltså blanda int, decimal, string etc. hur vi vill. Denna användes innan de generiska klasserna fanns, dvs. innan version 2.0 av.net. Använd om möjligt de generiska varianterna då de är säkrare. Mer information om denna klass finns i böckerna EC Utbildning AB 2013-01-15 31