C# Collections Tutorial med eksempler

⚡ Smart oppsummering

Samlinger i C# gir en fleksibel måte å lagre og administrere grupper av objekter på. I motsetning til arrayer vokser og krymper samlinger under kjøretid, og navnerommene System.Collections og System.Collections.Generic leverer ferdige typer for lister, ordbøker, stabler og køer.

  • 🔃 Dynamisk størrelsesvalg: Samlinger legger til og fjerner elementer under kjøretid, slik at du ikke fastsetter størrelsen på forhånd som en array.
  • 📚 Navneplasser: System.Collections inneholder de ikke-generiske typene, mens System.Collections.Generic inneholder de typesikre generiske typene.
  • 🧱 Kjerneklasser: ArrayList, Stack, Queue, Hashtable, SortedList og BitArray dekker de vanlige ikke-generiske behovene.
  • Generisk kraft: Liste, ordbok, HashSet og kø legger til typesikkerhet under kompilering og bedre ytelse.
  • 🔑 Riktig valg: Bruk en ordbok for nøkkeloppslag, en liste for bestilte varer og en stabel eller kø for LIFO- eller FIFO-ordre.
  • 🤖 AI-hjelp: GitHub Copilot stillaser samlingskode, og ML.NET-pipelines sender data gjennom generiske samlingstyper.

Samlinger i C#

I vår forrige opplæring har vi lært om hvordan vi kan bruke arrays i C#. La oss få en rask oversikt over det, Arrays i programmering brukes til å gruppere et sett med relaterte objekter. Så man kan lage en matrise eller et sett med heltall, som kan nås via ett variabelnavn.

Hva er samlinger i C#?

Samlinger ligner på arrays, gir det en mer fleksibel måte å jobbe med en gruppe objekter på.

I matriser ville du ha lagt merke til at du må definere antall elementer i en matrise på forhånd. Dette måtte gjøres når matrisen ble deklarert.

Men i en samling trenger du ikke definere størrelsen på samlingen på forhånd. Du kan legge til elementer eller til og med fjerne elementer fra samlingen når som helst. Dette kapittelet vil fokusere på hvordan vi kan jobbe med de forskjellige samlingene som er tilgjengelige i C#.

System.Samlinger Klasser

.NET Framework grupperer de originale ikke-generiske samlingsklassene i navnerommet System.Collections. Tabellen nedenfor oppsummerer hovedtypene du kan bruke med en gang.

Samling Tekniske beskrivelser
ArrayList ArrayList-samlingen ligner på Arrays datatype i C#. Den største forskjellen er den dynamiske karakteren til array-listesamlingen.
Stable Stakken er en spesialsamling som representerer et sist inn, først ut (LIFO)-konsept.
køer Køen er en spesialkolleksjon som representerer et først inn, først ut-konsept.
Hastbar En hash-tabell er en spesiell samling som brukes til å lagre nøkkelverdi-elementer.
Sortert Liste SortedList er en samling som lagrer nøkkel-verdi-par i stigende rekkefølge av nøkkel som standard.
BitArray En bitarray er en matrise med datastruktur som lagrer biter.

Generiske samlinger i C#

De ikke-generiske klassene ovenfor lagrer hvert element som et generelt objekt, noe som betyr at kompilatoren ikke kan sjekke typen, og programmet betaler en liten kostnad for å sette verdier i boks. For å løse dette la C# til navnerommet System.Collections.Generic, der hver samling er bundet til én deklarert type.

En generisk samling som Liste aksepterer bare strenger, slik at feil fanges opp ved kompileringstid og ingen konvertering er nødvendig når du leser et element tilbake. Dette gjør generiske samlinger tryggere, raskere og enklere å lese, og det er derfor de er standardvalget i moderne C#-kode.

De vanligste generiske samlingene er listet opp nedenfor:

  • Liste : En skalerbar, indeksbasert liste, den generiske erstatningen for ArrayList.
  • Ordbok : Lagrer nøkkel-verdi-par med raske, hash-baserte oppslag.
  • HashSet : Inneholder kun unike verdier og støtter settoperasjoner som union.
  • Kø : En først inn, først ut-kolleksjon, den generiske versjonen av Queue.
  • Stable : En «sist inn, først ut»-kolleksjon, den generiske versjonen av Stack.
  • Sortert liste : Holder nøkkelverdipar sortert etter nøkkel i stigende rekkefølge.

Eksempel på C#-listesamling

Listen er den mest brukte generiske samlingen fordi den oppfører seg som en dynamisk matrise. Eksemplet nedenfor oppretter en liste med strenger, legger til og fjerner elementer, leser størrelsen og skriver deretter ut de resterende verdiene. All koden er skrevet i Program.cs-filen.

Trinn 1) Importer navnerommet System.Collections.Generic og deklarer en liste med strenger.

Trinn 2) Legg til elementer med Legg til-metoden og slett ett med Fjern-metoden.

Trinn 3) Les Count-egenskapen, og gå deretter gjennom listen i løkke med en foreach-setning.

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code Forklaring:-

  1. Navnerommet System.Collections.Generic importeres slik at List-typen er tilgjengelig for programmet.
  2. En ny liste kalte veiledninger opprettes, og tre navn legges til med Add-metoden.
  3. Fjern-metoden sletter verdien «Python«, som etterlater to elementer på listen.
  4. Count-egenskapen returnerer antall elementer, og foreach-løkken skriver ut hver gjenværende verdi i rekkefølge.

Når programmet kjører, skriver det først ut antallet 2, Etterfulgt av Java og Kotlin på separate linjer. Dette viser hvordan en samling endrer størrelsen under kjøring, noe en fast array ikke kan gjøre.

Forskjellen mellom arrayer og samlinger i C#

Både en matrise og en samling grupperer relaterte elementer under ett navn, men de oppfører seg annerledes når programmet kjører. Å vite når du skal bruke hver av dem hjelper deg med å skrive renere og mer effektiv kode.

De viktigste forskjellene er listet opp nedenfor:

  • Størrelse: En array har en fast lengde satt ved deklarasjon, mens en samling kan vokse eller krympe når som helst.
  • Typehåndtering: En array lagrer én type, mens en samling kan være typesikker med generiske objekter eller holde objekter av blandede typer når de ikke er generiske.
  • Sted: Arrayer er innebygd i språket, mens samlingsklasser ligger i navnerommene System.Collections og System.Collections.Generic.
  • Innebygde operasjoner: Samlinger tilbyr klare metoder for å legge til, fjerne, søke etter og sortere elementer, mens arrayer bare gir grunnleggende indeksert tilgang.
  • Beste bruk: Velg en matrise når antallet elementer er kjent og fast, og en samling når antallet endres etter hvert som programmet kjører.

Kort sagt, arrayer er best for data med fast størrelse, mens samlinger gir fleksibiliteten som de fleste virkelige applikasjoner trenger.

Spørsmål og svar

Bruk en ordbok når du trenger raske oppslag med en unik nøkkel, for eksempel en ID som er tilordnet en post. Den finner verdier i nesten konstant tid, mens en liste må skanne elementer én etter én.

HashSet og Dictionary gir de raskeste oppslagene fordi de bruker hashing for å nå et element i nesten konstant tid. En liste eller en matrise er tregere fordi den kan måtte sjekke hvert element i rekkefølge.

Samtidige samlinger ligger i navnerommet System.Collections.Concurrent og er bygget for flertrådet kode. Typer som ConcurrentDictionary og BlockingCollection lar flere tråder legge til og fjerne elementer trygt uten manuelle låsinger.

IEnumerable er basisgrensesnittet som bare støtter lesing av elementer med en foreach-løkke. iCollection utvider det og legger til medlemmer som Count, Add og Remove, slik at det også støtter endring av samlingen.

List er en generisk, typesikker samling som lagrer én deklarert type, noe som gir kontroller under kompilering og bedre ytelse. ArrayList er ikke-generisk og lagrer hvert element som et objekt, som trenger konvertering og tillater blandede typer.

En Stack fungerer etter «sist inn, først ut»-rekkefølge, slik at det nyeste elementet fjernes først ved hjelp av Pop. En Queue fungerer etter «først inn, først ut»-rekkefølge, slik at det eldste elementet fjernes først ved hjelp av Dequeue.

Ja. GitHub Copilot kan foreslå riktig samlingstype, generere løkker som legger til eller filtrerer elementer, og fullføre LINQ-spørringer fra en kort kommentar, noe som fremskynder arbeidet med lister, ordbøker og andre samlinger.

ML.NET mater treningsdata gjennom samlinger som List og IEnumerable, som er tilordnet IDataView-pipelinen. Lagring av eksempler i en sterkt typet generisk samling holder maskinlæringsarbeidsflyten tydelig og typesikker.

Oppsummer dette innlegget med: