Vodič za zbirke C# s primjerima

⚡ Pametni sažetak

Kolekcije u C# pružaju fleksibilan način pohranjivanja i upravljanja grupama objekata. Za razliku od nizova, kolekcije rastu i smanjuju se tijekom izvođenja, a imenski prostori System.Collections i System.Collections.Generic pružaju gotove tipove za liste, rječnike, stogove i redove čekanja.

  • 🔃 Dinamičko dimenzioniranje: Kolekcije dodaju i uklanjaju elemente tijekom izvođenja, tako da ne fiksirate veličinu unaprijed kao kod niza.
  • 📚 Imenski prostori: System.Collections sadrži negeneričke tipove, dok System.Collections.Generic sadrži generičke tipove sigurne za tip.
  • 🧱 Osnovne nastave: ArrayList, Stack, Queue, Hashtable, SortedList i BitArray pokrivaju uobičajene negeneričke potrebe.
  • Generična snaga: Lista, Dictionary, HashSet i Queue dodaju sigurnost tipova tijekom kompajliranja i bolje performanse.
  • 🔑 Pravi izbor: Koristite rječnik za ključne pretrage, popis za poredane stavke i stog ili red za LIFO ili FIFO poredak.
  • 🤖 AI pomoć: GitHub Copilot scaffoldsira kod kolekcije, a ML.NET cjevovodi prosljeđuju podatke kroz generičke tipove kolekcija.

Kolekcije u C#-u

U našem prethodnom vodiču naučili smo kako možemo koristiti nizove u C#. Hajdemo ga kratko pregledati. Nizovi se u programiranju koriste za grupiranje skupa povezanih objekata. Tako se može stvoriti polje ili skup cijelih brojeva, kojima se može pristupiti putem jednog naziva varijable.

Što su zbirke u C#?

Zbirke su slične nizovi, pruža fleksibilniji način rada s grupom objekata.

U nizovima ste primijetili da morate unaprijed definirati broj elemenata u nizu. Ovo je moralo biti učinjeno kada je polje deklarirano.

Ali u zbirci ne morate unaprijed definirati veličinu zbirke. Možete dodati elemente ili čak ukloniti elemente iz zbirke u bilo kojem trenutku. Ovo će se poglavlje usredotočiti na to kako možemo raditi s različitim kolekcijama dostupnim u C#.

System.Collections Klase

.NET Framework grupira izvorne negeneričke klase kolekcija unutar imenskog prostora System.Collections. Tablica u nastavku sažima glavne tipove koje možete odmah koristiti.

Kolekcija Description
ArrayList Zbirka ArrayList slična je kolekciji Arrays tip podataka u C#. Najveća razlika je dinamička priroda zbirke popisa polja.
Stog Stog je posebna kolekcija slučajeva koja predstavlja koncept "zadnji unutra, prvi van" (LIFO).
redovi Red je posebna kolekcija slučajeva koja predstavlja koncept "prvi unutra, prvi van".
Raspršena tablica Hash tablica je posebna kolekcija koja se koristi za pohranjivanje elemenata ključ-vrijednost.
SortedList SortedList je zbirka koja pohranjuje parove ključ-vrijednost prema zadanim uzlaznim redoslijedom ključa.
BitArray Niz bitova je niz strukture podataka koji pohranjuje bitove.

Generičke kolekcije u C#

Gore navedene negeneričke klase pohranjuju svaki element kao opći objekt, što znači da kompajler ne može provjeriti tip i program plaća malu cijenu za pakiranje vrijednosti. Kako bi se to riješilo, C# je dodao imenski prostor System.Collections.Generic, gdje je svaka kolekcija vezana za jedan deklarirani tip.

Generička kolekcija kao što je Lista Prihvaća samo nizove znakova, pa se pogreške hvataju tijekom kompajliranja i nije potrebno pretvaranje (casting) prilikom čitanja stavke. To čini generičke kolekcije sigurnijima, bržima i lakšima za čitanje, zbog čega su zadani izbor u modernom C# kodu.

Najčešće generičke kolekcije navedene su u nastavku:

  • Popis : Popis promjenjive veličine, temeljen na indeksu, generička zamjena za ArrayList.
  • Rječnik : Pohranjuje parove ključ-vrijednost s brzim pretragama temeljenim na hashu.
  • HashSet : Sadrži samo jedinstvene vrijednosti i podržava operacije sa skupovima kao što je unija.
  • Red : Kolekcija "prvi ušao, prvi izašao", generička verzija Queue-a.
  • Stog : Kolekcija "zadnji unutra, prvi van", generička verzija Stacka.
  • Sortirani popis : Održava parove ključ-vrijednost sortirane po ključu u uzlaznom redoslijedu.

Primjer kolekcije C# liste

Lista je najčešće korištena generička kolekcija jer se ponaša kao dinamički niz. Primjer u nastavku stvara popis nizova, dodaje i uklanja stavke, čita njegovu veličinu, a zatim ispisuje preostale vrijednosti. Sav kod je napisan u datoteci Program.cs.

Korak 1) Uvezite imenski prostor System.Collections.Generic i deklarirajte popis nizova.

Korak 2) Dodajte stavke metodom Add, a izbrišite jednu metodom Remove.

Korak 3) Pročitajte svojstvo Count, a zatim prođite kroz listu pomoću naredbe foreach.

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 Obrazloženje:-

  1. Imenski prostor System.Collections.Generic se uvozi tako da je tip List dostupan programu.
  2. Novi popis nazvan tutorijali se stvara, a tri imena se dodaju metodom Add.
  3. Metoda Remove briše vrijednost "Python”, što ostavlja dvije stavke na popisu.
  4. Svojstvo Count vraća broj stavki, a petlja foreach ispisuje svaku preostalu vrijednost redom.

Kada se program pokrene, prvo ispisuje broj 2, Nakon čega slijedi Java i Kotlin u odvojenim retcima. Ovo pokazuje kako kolekcija mijenja svoju veličinu tijekom izvođenja, nešto što fiksni niz ne može učiniti.

Razlika između nizova i kolekcija u C#

Oba an poredak i kolekcija grupira povezane stavke pod jednim imenom, no one se ponašaju drugačije nakon što se program pokrene. Poznavanje kada koristiti koju od njih pomaže vam da napišete čišći i učinkovitiji kod.

Glavne razlike navedene su u nastavku:

  • Veličina pakiranja: Niz ima fiksnu duljinu postavljenu prilikom deklaracije, dok kolekcija može rasti ili smanjivati ​​u bilo kojem trenutku.
  • Obrada tipova: Niz pohranjuje jedan tip, dok kolekcija može biti sigurna po tipu s generičkim objektima ili sadržavati objekte miješanih tipova kada nisu generički.
  • Mjesto: Nizovi su ugrađeni u jezik, dok se klase kolekcija nalaze u imenskim prostorima System.Collections i System.Collections.Generic.
  • Ugrađene operacije: Kolekcije nude spremne metode za dodavanje, uklanjanje, pretraživanje i sortiranje elemenata, dok nizovi pružaju samo osnovni indeksirani pristup.
  • Najbolje korištenje: Odaberite niz kada je broj elemenata poznat i fiksan, te kolekciju kada se broj mijenja kako se program izvršava.

Ukratko, nizovi su najbolji za podatke fiksne veličine, dok kolekcije pružaju fleksibilnost koja je potrebna većini stvarnih aplikacija.

Pitanja i odgovori

Koristite rječnik kada vam je potrebno brzo pretraživanje pomoću jedinstvenog ključa, kao što je ID mapiran na zapis. Pronalazi vrijednosti u gotovo konstantnom vremenu, dok popis mora skenirati stavke jednu po jednu.

HashSet i Dictionary pružaju najbrže pretrage jer koriste hashiranje za dosezanje elementa u gotovo konstantnom vremenu. Lista ili niz su sporiji jer možda trebaju provjeriti svaki element u nizu.

Konkurentne kolekcije nalaze se u imenskom prostoru System.Collections.Concurrent i izgrađene su za višenitni kod. Tipovi kao što su ConcurrentDictionary i BlockingCollection omogućuju nekoliko niti da sigurno dodaju i uklanjaju stavke bez ručnih zaključavanja.

IEnumerable je osnovno sučelje koje podržava samo čitanje stavki s foreach petljom. ICollection ga proširuje i dodaje članove kao što su Count, Add i Remove, tako da također podržava modificiranje kolekcije.

List je generička, tipovno sigurna kolekcija koja pohranjuje jedan deklarirani tip, pružajući provjere tijekom kompajliranja i bolje performanse. ArrayList nije generički i pohranjuje svaku stavku kao objekt, koji zahtijeva pretvaranje (cast) i dopušta miješane tipove.

Stog radi po principu "zadnji unutra, prvi van", pa se najnovija stavka prva uklanja pomoću funkcije Pop. Red rada radi po principu "prvi unutra, prvi van", pa se najstarija stavka prva uklanja pomoću funkcije Dequeue.

Da. GitHub Copilot može predložiti pravu vrstu kolekcije, generirati petlje koje dodaju ili filtriraju stavke i dovršiti LINQ upite iz kratkog komentara, što ubrzava rad s popisima, rječnicima i drugim kolekcijama.

ML.NET šalje podatke za obuku putem kolekcija kao što su List i IEnumerable, koje se mapiraju na njegov IDataView cjevovod. Pohranjivanje uzoraka u generičku kolekciju snažnog tipa održava tijek rada strojnog učenja jasnim i sigurnim za tip.

Sažmite ovu objavu uz: