CSharp2 - Arrayer och Collections

Arrayer (vektorer)
Murach’s: kap 8
1
2013-01-15
© 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
Namnet på arrayen (variabelnamet)
new
Minne för arrayen allokeras (arrayer är klasser i .NET)
size
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;
prices[1] = 3.14m;
© EC Utbildning AB
//första elementet
//andra (sista) elementet
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
Kolumn
0
1
2
0
0
0
0
0
0
0
1
2
Rad
0
1
// Skapa arrayen
int[,] myArray = new int[2, 3];
Kolumn
//Första raden
myArray[0, 0] = 1;
myArray[0, 1] = 2;
myArray[0, 2] = 3;
Rad
0
1
2
3
//Andra raden
myArray[1, 0] = 4;
myArray[1, 1] = 5;
myArray[1, 2] = 6;
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
12
2013-01-15
© 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:
© EC Utbildning AB
10,90 kr
23,00 kr
139,00 kr
59,90 kr
74,50 kr
307,30 kr
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);
© EC Utbildning AB
1
0
0
0
0
6
7
8
2013-01-15
20
Collections (samlingar)
Murach’s: kap 8 (från s. 232)
21
2013-01-15
© 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>
En kö av typen FIFO (First In, First Out).
Det som kommer först in i kön tas först ut.
Stack<T>
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
Antalet element i listan, alltså samma värde
som Length hos en array.
Add(object)
Lägg till ett element i listan. Elementet lägger
sig sist.
Clear()
Tömmer och nollställer listan.
Sort()
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
Beskrivning
Add(TKey, TValue)
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);
Spagetti kostar 12,00 kr
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();
© 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