Handledning för C# Collections med exempel

⚡ Smart sammanfattning

Samlingar i C# erbjuder ett flexibelt sätt att lagra och hantera grupper av objekt. Till skillnad från arrayer växer och krymper samlingar vid körning, och namnrymderna System.Collections och System.Collections.Generic tillhandahåller färdiga typer för listor, ordböcker, stackar och köer.

  • 🔃 Dynamisk storleksändring: Samlingar lägger till och tar bort element under körning, så du fixerar inte storleken i förväg som en array.
  • 📚 Namnrymder: System.Collections innehåller de icke-generiska typerna, medan System.Collections.Generic innehåller de typsäkra generiska typerna.
  • 🧱 Kärnkurser: ArrayList, Stack, Queue, Hashtable, SortedList och BitArray täcker de vanliga icke-generiska behoven.
  • Generisk kraft: List, Dictionary, HashSet och Queue ger typsäkerhet vid kompilering och bättre prestanda.
  • 🔑 Rätt val: Använd en ordbok för nyckelsökningar, en lista för beställda artiklar och en stapel eller kö för LIFO- eller FIFO-order.
  • 🤖 AI-hjälp: GitHub Copilot scaffoldar samlingskod och ML.NET-pipelines skickar data genom generiska samlingstyper.

Samlingar i C#

I vår tidigare handledning har vi lärt oss om hur vi kan använda arrayer i C#. Låt oss få en snabb överblick av det, Arrays i programmering används för att gruppera en uppsättning relaterade objekt. Så man kan skapa en array eller en uppsättning heltal, som kan nås via ett variabelnamn.

Vad är samlingar i C#?

Samlingar liknar arrayer, ger det ett mer flexibelt sätt att arbeta med en grupp av objekt.

I arrayer skulle du ha märkt att du måste definiera antalet element i en array i förväg. Detta måste göras när arrayen deklarerades.

Men i en samling behöver du inte definiera storleken på samlingen i förväg. Du kan lägga till element eller till och med ta bort element från samlingen när som helst. Det här kapitlet kommer att fokusera på hur vi kan arbeta med de olika samlingarna som finns tillgängliga i C#.

System. Collections Klasser

.NET Framework grupperar de ursprungliga icke-generiska samlingsklasserna i namnrymden System.Collections. Tabellen nedan sammanfattar de huvudtyper du kan använda direkt.

Samling BESKRIVNING
Arraylist ArrayList-samlingen liknar Arrays datatyp i C#. Den största skillnaden är den dynamiska karaktären hos arraylistsamlingen.
Stack Stacken är en specialfallssamling som representerar ett sist in, först ut (LIFO)-koncept.
köer Kön är en specialkollektion som representerar ett först in, först ut-koncept.
Hastbar En hashtabell är en speciell samling som används för att lagra nyckel-värde-objekt.
Sorterad lista SortedList är en samling som lagrar nyckel-värdepar i stigande nyckelordning som standard.
BitArray En bitarray är en matris av datastruktur som lagrar bitar.

Generiska samlingar i C#

De icke-generiska klasserna ovan lagrar varje element som ett generellt objekt, vilket innebär att kompilatorn inte kan kontrollera typen och programmet betalar en liten kostnad för att boxa värden. För att lösa detta lade C# till namnrymden System.Collections.Generic, där varje samling är bunden till en deklarerad typ.

En generisk samling som List accepterar bara strängar, så misstag upptäcks vid kompileringstillfället och ingen konvertering behövs när du läser tillbaka ett objekt. Detta gör generiska samlingar säkrare, snabbare och lättare att läsa, vilket är anledningen till att de är standardvalet i modern C#-kod.

De vanligaste generiska samlingarna listas nedan:

  • Lista : En anpassningsbar, indexbaserad lista, den generiska ersättningen för ArrayList.
  • Ordbok : Lagrar nyckel-värde-par med snabba, hash-baserade sökningar.
  • HashSet : Innehåller endast unika värden och stöder mängdoperationer som union.
  • Kö : En först in, först ut-kollektion, den generiska versionen av Queue.
  • Stack : En sist in, först ut-kollektion, den generiska versionen av Stack.
  • Sorterad lista : Håller nyckel-värde-par sorterade efter nyckel i stigande ordning.

C# Listsamlingsexempel

Listan är den mest använda generiska samlingen eftersom den beter sig som en dynamisk array. Exemplet nedan skapar en lista med strängar, lägger till och tar bort objekt, läser dess storlek och skriver sedan ut de återstående värdena. All kod är skriven i Program.cs-filen.

Steg 1) Importera namnrymden System.Collections.Generic och deklarera en lista med strängar.

Steg 2) Lägg till objekt med metoden Lägg till och ta bort ett med metoden Ta bort.

Steg 3) Läs egenskapen Count och loopa sedan igenom listan med en foreach-sats.

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 Förklaring:-

  1. Namnrymden System.Collections.Generic importeras så att List-typen är tillgänglig för programmet.
  2. En ny lista kallade handledningar skapas och tre namn läggs till med Add-metoden.
  3. Metoden Ta bort tar bort värdet "Python”, vilket lämnar två punkter kvar i listan.
  4. Egenskapen Count returnerar antalet objekt, och foreach-slingan skriver ut varje återstående värde i ordning.

När programmet körs skriver det först ut antalet 2, Följt av Java och Kotlin på separata rader. Detta visar hur en samling ändrar sin storlek vid körning, något som en fast array inte kan göra.

Skillnaden mellan arrayer och samlingar i C#

Både en array och en samling grupperar relaterade objekt under ett namn, men de beter sig olika när programmet körs. Att veta när man ska använda varje namn hjälper dig att skriva renare och effektivare kod.

De viktigaste skillnaderna listas nedan:

  • Storlek: En array har en fast längd som sätts vid deklarationen, medan en samling kan växa eller krympa när som helst.
  • Typhantering: En array lagrar en enda typ, medan en samling kan vara typsäker med generiska typer eller innehålla objekt av blandade typer när de inte är generiska.
  • Plats: Arrayer är inbyggda i språket, medan samlingsklasser finns i namnrymderna System.Collections och System.Collections.Generic.
  • Inbyggda funktioner: Samlingar erbjuder färdiga metoder för att lägga till, ta bort, söka och sortera objekt, medan arrayer endast ger grundläggande indexerad åtkomst.
  • Bästa användning: Välj en array när antalet objekt är känt och fast, och en samling när antalet ändras medan programmet körs.

Kort sagt, arrayer är bäst för data med fast storlek, medan samlingar ger den flexibilitet som de flesta verkliga applikationer behöver.

Vanliga frågor

Använd en ordbok när du behöver snabba sökningar med en unik nyckel, till exempel ett ID som är mappat till en post. Den hittar värden i nästan konstant tid, medan en lista måste skanna objekt ett i taget.

HashSet och Dictionary ger de snabbaste uppsökningarna eftersom de använder hashing för att nå ett element i nästan konstant tid. En lista eller en array är långsammare eftersom den kan behöva kontrollera varje element i sekvens.

Samtidiga samlingar finns i namnrymden System.Collections.Concurrent och är byggda för flertrådad kod. Typer som ConcurrentDictionary och BlockingCollection låter flera trådar lägga till och ta bort objekt säkert utan manuella låsningar.

IEnumerable är basgränssnittet som endast stöder läsning av objekt med en foreach-loop. iCollection utökar det och lägger till medlemmar som Count, Add och Remove, så det stöder även modifiering av samlingen.

List är en generisk, typsäker samling som lagrar en deklarerad typ, vilket ger kontroller vid kompilering och bättre prestanda. ArrayList är icke-generisk och lagrar varje objekt som ett objekt, vilket behöver omvandlas och tillåter blandade typer.

En Stack fungerar i ordningen "sist in, först ut", så det senaste objektet tas bort först med hjälp av Pop. En Queue fungerar i ordningen "först in, först ut", så det äldsta objektet tas bort först med hjälp av Dequeue.

Ja. GitHub Copilot kan föreslå rätt samlingstyp, generera loopar som lägger till eller filtrerar objekt och slutföra LINQ-frågor från en kort kommentar, vilket snabbar upp arbetet med listor, ordböcker och andra samlingar.

ML.NET matar träningsdata genom samlingar som List och IEnumerable, vilka mappas till dess IDataView-pipeline. Att lagra exempel i en starkt typad generisk samling håller maskininlärningsarbetsflödet tydligt och typsäkert.

Sammanfatta detta inlägg med: