C# Collections Tutorial med eksempler

⚡ Smart opsummering

Samlinger i C# giver en fleksibel måde at gemme og administrere grupper af objekter på. I modsætning til arrays vokser og krymper samlinger under kørsel, og navnerummene System.Collections og System.Collections.Generic leverer færdige typer til lister, ordbøger, stakke og køer.

  • 🔃 Dynamisk størrelsesindstilling: Samlinger tilføjer og fjerner elementer under kørsel, så du fastsætter ikke størrelsen på forhånd som et array.
  • 📚 Navnerum: System.Collections indeholder de ikke-generiske typer, mens System.Collections.Generic indeholder de typesikre generiske typer.
  • 🧱 Kerneklasser: ArrayList, Stack, Queue, Hashtable, SortedList og BitArray dækker de almindelige ikke-generiske behov.
  • Generisk kraft: List, Dictionary, HashSet og Queue tilføjer typesikkerhed under kompilering og bedre ydeevne.
  • 🔑 Det rigtige valg: Brug en ordbog til nøgleopslag, en liste til bestilte varer og en stak eller kø til LIFO- eller FIFO-rækkefølge.
  • 🤖 AI assistance: GitHub Copilot scaffolder indsamlingskode, og ML.NET-pipelines sender data gennem generiske indsamlingstyper.

Samlinger i C#

I vores tidligere selvstudie har vi lært om, hvordan vi kan bruge arrays i C#. Lad os få et hurtigt overblik over det. Arrays i programmering bruges til at gruppere et sæt relaterede objekter. Så man kunne oprette en matrix eller et sæt af heltal, som kunne tilgås via ét variabelnavn.

Hvad er samlinger i C#?

Samlinger ligner Arrays, giver det en mere fleksibel måde at arbejde med en gruppe af objekter på.

I arrays ville du have bemærket, at du på forhånd skal definere antallet af elementer i et array. Dette skulle gøres, da arrayet blev deklareret.

Men i en samling behøver du ikke på forhånd at definere samlingens størrelse. Du kan tilføje elementer eller endda fjerne elementer fra samlingen på et hvilket som helst tidspunkt. Dette kapitel vil fokusere på, hvordan vi kan arbejde med de forskellige samlinger, der er tilgængelige i C#.

System.Collections Klasser

.NET Framework grupperer de originale ikke-generiske samlingsklasser i navnerummet System.Collections. Tabellen nedenfor opsummerer de primære typer, du kan bruge med det samme.

Kollektion Beskrivelse
ArrayList ArrayList-samlingen ligner Arrays datatype i C#. Den største forskel er den dynamiske karakter af array-listesamlingen.
Stak Stakken er en specialcase-samling, der repræsenterer et sidst ind, først ud (LIFO)-koncept.
køer Køen er en specialcase-kollektion, der repræsenterer et først ind, først ud-koncept.
hashtabelsamling En hashtabel er en særlig samling, der bruges til at gemme nøgleværdielementer.
Sorteret Liste SortedList er en samling, der som standard gemmer nøgle-værdi-par i stigende rækkefølge efter nøgle.
BitArray En bit-array er en matrix af datastruktur, som gemmer bits.

Generiske samlinger i C#

De ikke-generiske klasser ovenfor gemmer hvert element som et generelt objekt, hvilket betyder, at compileren ikke kan kontrollere typen, og programmet betaler en lille omkostning for at sætte værdier i boks. For at løse dette tilføjede C# navnerummet System.Collections.Generic, hvor hver samling er bundet til én deklareret type.

En generisk samling som f.eks. Liste accepterer kun strenge, så fejl opdages ved kompilering, og der er ikke behov for casting, når du læser et element tilbage. Dette gør generiske samlinger sikrere, hurtigere og nemmere at læse, hvilket er grunden til, at de er standardvalget i moderne C#-kode.

De mest almindelige generiske samlinger er anført nedenfor:

  • Liste : En indeksbaseret liste, der kan tilpasses i størrelse, den generiske erstatning for ArrayList.
  • Ordbog : Gemmer nøgle-værdi-par med hurtige, hash-baserede opslag.
  • HashSet : Indeholder kun unikke værdier og understøtter sætoperationer såsom forening.
  • Kø : En først ind, først ud-kollektion, den generiske version af Queue.
  • Stak : En "sidst ind, først ud"-kollektion, den generiske version af Stack.
  • Sorteret liste : Holder nøgle-værdi-par sorteret efter nøgle i stigende rækkefølge.

Eksempel på C#-listesamling

Listen er den mest anvendte generiske samling, fordi den opfører sig som et dynamisk array. Eksemplet nedenfor opretter en liste med strenge, tilføjer og fjerner elementer, læser dens størrelse og udskriver derefter de resterende værdier. Al koden er skrevet i Program.cs-filen.

Trin 1) Importer navneområdet System.Collections.Generic, og deklarer en liste over strenge.

Trin 2) Tilføj elementer med Tilføj-metoden, og slet et med Fjern-metoden.

Trin 3) Læs egenskaben Count, og gennemgå derefter listen med en foreach-sætning.

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. Navneområdet System.Collections.Generic importeres, så List-typen er tilgængelig for programmet.
  2. En ny liste kaldet tutorials oprettes, og tre navne tilføjes med Add-metoden.
  3. Fjernelsesmetoden sletter værdien "Python", hvilket efterlader to punkter på listen.
  4. Egenskaben Count returnerer antallet af elementer, og foreach-løkken udskriver hver resterende værdi i rækkefølge.

Når programmet kører, udskriver det først antallet af 2, efterfulgt af Java og Kotlin på separate linjer. Dette viser, hvordan en samling ændrer sin størrelse under kørsel, noget et fast array ikke kan.

Forskellen mellem arrays og samlinger i C#

Både en matrix og en samling grupperer relaterede elementer under ét navn, men de opfører sig forskelligt, når programmet kører. At vide, hvornår man skal bruge hver enkelt, hjælper dig med at skrive renere og mere effektiv kode.

De vigtigste forskelle er anført nedenfor:

  • Størrelse: Et array har en fast længde, der er angivet ved deklarationen, mens en samling kan vokse eller krympe når som helst.
  • Typehåndtering: Et array gemmer en enkelt type, hvorimod en samling kan være typesikker med generiske objekter eller indeholde objekter af blandede typer, når de ikke er generiske.
  • Beliggenhed: Arrays er indbygget i sproget, mens samlingsklasser findes i navnerummene System.Collections og System.Collections.Generic.
  • Indbyggede operationer: Samlinger tilbyder færdige metoder til at tilføje, fjerne, søge og sortere elementer, mens arrays kun giver grundlæggende indekseret adgang.
  • Bedste brug: Vælg et array, når antallet af elementer er kendt og fast, og en samling, når antallet ændrer sig, mens programmet kører.

Kort sagt er arrays bedst til data med fast størrelse, mens samlinger giver den fleksibilitet, som de fleste virkelige applikationer har brug for.

Ofte Stillede Spørgsmål

Brug en ordbog, når du har brug for hurtige opslag med en unik nøgle, f.eks. et ID, der er knyttet til en post. Den finder værdier i næsten konstant tid, mens en liste skal scanne elementerne et efter et.

HashSet og Dictionary giver de hurtigste opslag, fordi de bruger hashing til at nå et element i næsten konstant tid. En liste eller et array er langsommere, fordi det kan være nødvendigt at kontrollere hvert element i rækkefølge.

Samtidige samlinger findes i navneområdet System.Collections.Concurrent og er bygget til flertrådet kode. Typer som ConcurrentDictionary og BlockingCollection gør det muligt for flere tråde at tilføje og fjerne elementer sikkert uden manuelle låse.

IEnumerable er basisgrænsefladen, der kun understøtter læsning af elementer med en foreach-løkke. iCollection udvider den og tilføjer medlemmer som Count, Add og Remove, så den også understøtter ændring af samlingen.

List er en generisk, typesikker samling, der gemmer én deklareret type, hvilket giver kontrol under kompilering og bedre ydeevne. ArrayList er ikke-generisk og gemmer hvert element som et objekt, der kræver casting og tillader blandede typer.

En stak fungerer i rækkefølge efter "sidst ind, først ud", så det nyeste element fjernes først ved hjælp af Pop. En kø fungerer i rækkefølge efter "først ind, først ud", så det ældste element fjernes først ved hjælp af Dequeue.

Ja. GitHub Copilot kan foreslå den rigtige samlingstype, generere løkker, der tilføjer eller filtrerer elementer, og fuldføre LINQ-forespørgsler fra en kort kommentar, hvilket fremskynder arbejdet med lister, ordbøger og andre samlinger.

ML.NET sender træningsdata gennem samlinger som List og IEnumerable, som er knyttet til dens IDataView-pipeline. Lagring af eksempler i en stærkt typebestemt generisk samling holder maskinlæringsarbejdsgangen klar og typesikker.

Opsummer dette indlæg med: