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: