Hoppa till innehåll

Arrayer och flerdimensionell data

↑

Exemplen är oberoende C#-utdrag för moderna .NET-konsolprojekt, om inget annat anges. Klassdeklarationer och toppnivåkod kan placeras i samma Program.cs-fil, med toppnivåkoden först.

En array innehåller ett fast antal element av samma elementtyp. Element kan hämtas direkt via index, vilket gör arrayer centrala i många algoritmer.

Arrayindex börjar på noll. Length är antalet element. Längden är fast, men elementen kan normalt ändras.

Example.cs
int[] scores = { 7, 3, 9 };
scores[1] = 5;
Console.WriteLine(scores[0]); // 7
Console.WriteLine(scores.Length); // 3

Använd for när du behöver både index och värde, annars ofta foreach. Array.Sort ändrar arrayen direkt, så kopiera den först om ursprunglig ordning ska bevaras.

Example.cs
int[] original = { 38, 12, 27 };
int[] sorted = (int[])original.Clone();
Array.Sort(sorted);
foreach (int number in sorted)
Console.WriteLine(number); // 12, 27, 38

En rektangulär array (int[,]) har en fast rutnätsform. En nästlad array (int[][]) är en array av arrayer, vilket gör att raderna kan ha olika längd.

Example.cs
int[,] grid = { { 1, 2 }, { 3, 4 } };
Console.WriteLine(grid[1, 0]); // 3
int[][] rows = { new[] { 1 }, new[] { 2, 3 } };
Console.WriteLine(rows[1][1]); // 3

Fördjupning: index, kopiering och rätt samlingstyp

Section titled “Fördjupning: index, kopiering och rätt samlingstyp”

En array har fast längd, inte fasta värden

Section titled “En array har fast längd, inte fasta värden”

new int[3] skapar tre heltalsplatser som börjar med noll. Du kan ersätta värdena men inte ändra längden på samma arrayobjekt. Index går från 0 till Length - 1. numbers[^1] betyder sista elementet, medan ett intervall som numbers[1..3] skapar en ny array med de valda elementen för vanliga arrayer.

Kopiera när ändringar ska vara oberoende

Section titled “Kopiera när ändringar ska vara oberoende”

En array är en referenstyp. int[] second = first; skapar ännu en referens till samma array. Om second[0] ändras ser du det även genom first[0]. Array.Clone() skapar en ytlig kopia: för en array med heltal är värdena oberoende, men för en array av klassobjekt pekar elementen fortfarande på samma objekt.

Program.cs
int[] original = { 38, 12, 27 };
int[] copy = (int[])original.Clone();
Array.Sort(copy);
Console.WriteLine(string.Join(", ", original)); // 38, 12, 27
Console.WriteLine(string.Join(", ", copy)); // 12, 27, 38

Arrayer, listor och spans fyller olika behov

Section titled “Arrayer, listor och spans fyller olika behov”

En array är bra för fast storlek och snabb indexering. List<T> växer när du lägger till element och erbjuder bland annat Add och Remove. Internt kan lagringskapaciteten vara större än aktuellt Count. Span<T> är en begränsad vy över sammanhängande minne utan att alltid skapa en ny array, men har särskilda regler för livslängd och användning. Börja med arrayer och List<T> och välj spans när en uppmätt prestandavinst motiverar det.

int[,] grid beskriver en rektangulär array, där dimensionernas längd kan läsas via GetLength(dimension). int[][] rows är en array med andra arrayer som element. Raderna kan ha olika längd eller till och med vara null. Välj efter datastrukturen, inte efter en generell föreställning om vad som alltid är snabbast.

Indexering är normalt O(1). Att söka igenom en osorterad array tar vanligtvis O(n) i värsta fallet. Sortering kräver mer arbete och ändrar ordningen. Binärsökning förutsätter att datan redan är sorterad enligt rätt jämförelse. För små mängder data är korrekt och begriplig kod ofta viktigare än teoretiska prestandavinster.

Använd arrayer för ordnade värden med fast storlek och List<T> när antalet element ändras ofta.

array[array.Length] ligger utanför arrayen. Array.Sort ändrar arrayen i stället för att returnera en ny.

Sortera en kopia av en array utan att ändra originalet.

Visa ett lösningsförslag

int[] copy = (int[])numbers.Clone(); Array.Sort(copy);.