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.
Snabböversikt
Section titled “Snabböversikt”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.
Så fungerar det
Section titled “Så fungerar det”Skapa, läsa och ändra
Section titled “Skapa, läsa och ändra”Arrayindex börjar på noll. Length är antalet element. Längden är fast, men elementen kan normalt ändras.
int[] scores = { 7, 3, 9 };scores[1] = 5;Console.WriteLine(scores[0]); // 7Console.WriteLine(scores.Length); // 3Loopar och sortering
Section titled “Loopar och sortering”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.
int[] original = { 38, 12, 27 };int[] sorted = (int[])original.Clone();Array.Sort(sorted);foreach (int number in sorted) Console.WriteLine(number); // 12, 27, 38Rektangulära och nästlade arrayer
Section titled “Rektangulära och nästlade arrayer”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.
int[,] grid = { { 1, 2 }, { 3, 4 } };Console.WriteLine(grid[1, 0]); // 3int[][] rows = { new[] { 1 }, new[] { 2, 3 } };Console.WriteLine(rows[1][1]); // 3Fö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.
int[] original = { 38, 12, 27 };int[] copy = (int[])original.Clone();Array.Sort(copy);Console.WriteLine(string.Join(", ", original)); // 38, 12, 27Console.WriteLine(string.Join(", ", copy)); // 12, 27, 38Arrayer, 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.
Rektangulär och nästlad data
Section titled “Rektangulär och nästlad data”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.
Tänk på komplexiteten
Section titled “Tänk på komplexiteten”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.
När och varför?
Section titled “När och varför?”Använd arrayer för ordnade värden med fast storlek och List<T> när antalet element ändras ofta.
Vanligt misstag
Section titled “Vanligt misstag”array[array.Length] ligger utanför arrayen. Array.Sort ändrar arrayen i stället för att returnera en ny.
Testa själv
Section titled “Testa själv”Sortera en kopia av en array utan att ändra originalet.
Visa ett lösningsförslag
int[] copy = (int[])numbers.Clone(); Array.Sort(copy);.
