C# gyűjtemények bemutatója példákkal

⚡ Okos összefoglaló

A C# gyűjteményei rugalmas módot kínálnak objektumcsoportok tárolására és kezelésére. A tömbökkel ellentétben a gyűjtemények futásidőben növekednek és zsugorodnak, a System.Collections és a System.Collections.Generic névterek pedig kész típusokat biztosítanak listákhoz, szótárakhoz, veremekhez és várólistákhoz.

  • 🔃 Dinamikus méretezés: A gyűjtemények futásidőben adnak hozzá és távolítanak el elemeket, így a méretet nem kell előre rögzíteni, mint egy tömb esetében.
  • ???? Névterek: A System.Collections a nem generikus típusokat tárolja, míg a System.Collections.Generic a típusbiztos generikus típusokat.
  • 🧱 Alapvető osztályok: Az ArrayList, Stack, Queue, Hashtable, SortedList és BitArray lefedi a gyakori, nem általános igényeket.
  • Általános teljesítmény: A List, Dictionary, HashSet és Queue fordítási idejű típusbiztonságot és jobb teljesítményt biztosít.
  • 🔑 Helyes választás: Használjon szótárat a kulcskereséshez, listát a rendezett tételekhez, és köteget vagy várólistát a LIFO vagy FIFO sorrendhez.
  • 🤖 AI segítség: A GitHub Copilot scaffolding gyűjtési kódot használ, az ML.NET folyamatok pedig általános gyűjtési típusokon keresztül továbbítják az adatokat.

C# gyűjtemények

Korábbi oktatóanyagunkban megtanultuk, hogyan használhatunk tömböket C#-ban. Vegyünk egy gyors áttekintést róla, a programozásban a tömbök a kapcsolódó objektumok csoportosítására szolgálnak. Így létre lehet hozni egy tömböt vagy egész számok halmazát, amelyhez egyetlen változónéven keresztül lehet hozzáférni.

Mi az a gyűjtemény a C#-ban?

A gyűjtemények hasonlóak a tömbök, rugalmasabb módot biztosít az objektumok csoportjával való munkavégzésre.

A tömböknél észrevette volna, hogy előre meg kell határoznia egy tömb elemeinek számát. Ezt a tömb deklarálásakor kellett megtenni.

De egy gyűjteményben nem kell előre meghatározni a gyűjtemény méretét. Bármikor hozzáadhat elemeket, vagy akár eltávolíthat elemeket a gyűjteményből. Ez a fejezet arra összpontosít, hogyan dolgozhatunk a C# nyelven elérhető különböző gyűjteményekkel.

System.Collections osztályok

A .NET-keretrendszer az eredeti, nem generikus gyűjteményosztályokat a System.Collections névtérben csoportosítja. Az alábbi táblázat összefoglalja a főbb típusokat, amelyeket azonnal használhatsz.

Gyűjtemény Leírás
Tömb lista Az ArrayList gyűjtemény hasonló az Arrays-hez adattípus C#-ban. A legnagyobb különbség a tömblista-gyűjtemény dinamikus jellegében rejlik.
Stack A halom egy speciális esetgyűjtemény, amely az utolsó be, első ki (LIFO) koncepciót képviseli.
sorok A The Queue egy különleges kollekció, amely az „első be, első ki” koncepciót képviseli.
Hashtable A hash tábla egy speciális gyűjtemény, amelyet kulcs-érték elemek tárolására használnak.
SortedList A SortedList egy olyan gyűjtemény, amely alapértelmezés szerint a kulcs-érték párokat a kulcsok növekvő sorrendjében tárolja.
BitArray A bittömb olyan adatstruktúra tömb, amely biteket tárol.

Általános gyűjtemények C#-ban

A fenti nem generikus osztályok minden elemet általános objektumként tárolnak, ami azt jelenti, hogy a fordító nem tudja ellenőrizni a típust, és a program kis költséget fizet a dobozos értékekért. Ennek megoldására a C# hozzáadta a System.Collections.Generic névteret, ahol minden gyűjtemény egy deklarált típushoz van kötve.

Egy általános gyűjtemény, például a Lista csak karakterláncokat fogad el, így a hibákat fordítási időben észleli a rendszer, és nincs szükség konverzióra, amikor egy elemet visszaolvas. Ez biztonságosabbá, gyorsabbá és könnyebben olvashatóvá teszi az általános gyűjteményeket, ezért ezek az alapértelmezett választás a modern C# kódban.

A leggyakoribb generikus gyűjtemények az alábbiakban felsorolva vannak:

  • Lista : Egy átméretezhető, indexalapú lista, az ArrayList általános helyettesítője.
  • Szótár : Kulcs-érték párokat tárol gyors, hash alapú keresésekkel.
  • HashSet : Csak egyedi értékeket tárol, és támogatja a halmazműveleteket, például az uniót.
  • Sorban : Egy FIFO kollekció, a Queue generikus változata.
  • Stack : Utolsóként beérkező, elsőként kimenő kollekció, a Stack generikus változata.
  • Rendezett lista : A kulcs-érték párokat kulcs szerint növekvő sorrendben rendezi.

C# listagyűjtemény példa

A Lista a legszélesebb körben használt általános gyűjtemény, mivel dinamikus tömbként viselkedik. Az alábbi példa karakterláncokból álló listát hoz létre, elemeket ad hozzá és távolít el, beolvassa a méretét, majd kinyomtatja a fennmaradó értékeket. A teljes kód a Program.cs fájlban található.

Step 1) Importálja a System.Collections.Generic névteret, és deklaráljon egy karakterláncokból álló listát.

Step 2) Az Add metódussal adhatunk hozzá elemeket, az Remove metódussal pedig törölhetünk egyet.

Step 3) Olvasd be a Count tulajdonságot, majd menj végig a listán egy foreach utasítással.

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 Magyarázat:-

  1. A System.Collections.Generic névtér importálva van, így a List típus elérhetővé válik a program számára.
  2. Egy új lista Létrejön a tutorials nevű objektum, és az Add metódussal három nevet adunk hozzá.
  3. A Remove metódus törli a „Python”, ami két elemet hagy a listában.
  4. A Count tulajdonság visszaadja az elemek számát, a foreach ciklus pedig sorban kinyomtatja a fennmaradó értékeket.

Amikor a program fut, először kinyomtatja a darabszámot. 2, Ezt követi Java és a Kotlin külön sorokban. Ez azt mutatja, hogyan változtatja meg egy gyűjtemény mérete futásidőben, amit egy fix tömb nem tud megtenni.

Különbség a tömbök és a gyűjtemények között C#-ban

Mindkettő egy sor és egy gyűjtemény a kapcsolódó elemeket egy név alatt csoportosítja, mégis másképp viselkednek, miután a program fut. Ha tudjuk, mikor kell használni őket, az segít tisztább és hatékonyabb kódot írni.

A fő különbségek az alábbiakban felsorolva vannak:

  • Méret: Egy tömb hossza fix, a deklarációkor beállítva, míg egy gyűjtemény hossza bármikor növekedhet vagy zsugorodhat.
  • Típuskezelés: Egy tömb egyetlen típust tárol, míg egy gyűjtemény lehet típusbiztos generikusokkal, vagy vegyes típusú objektumokat tartalmazhat, ha nem generikus.
  • Bérleti díj: A tömbök be vannak építve a nyelvbe, míg a gyűjteményosztályok a System.Collections és a System.Collections.Generic névterekben találhatók.
  • Beépített műveletek: A gyűjtemények kész metódusokat kínálnak az elemek hozzáadására, eltávolítására, keresésére és rendezésére, míg a tömbök csak alapvető indexelt hozzáférést biztosítanak.
  • Legjobb felhasználás: Válasszunk tömböt, ha az elemek száma ismert és rögzített, és gyűjteményt, ha a darabszám a program futása során változik.

Röviden, a tömbök a fix méretű adatokhoz a legjobbak, míg a gyűjtemények biztosítják azt a rugalmasságot, amelyre a legtöbb valós alkalmazásnak szüksége van.

GYIK

Használjon szótárat, ha gyors keresésre van szüksége egyedi kulcs, például egy rekordhoz rendelt azonosító alapján. Ez közel állandó idő alatt találja meg az értékeket, míg egy listának egyesével kell végigpörgetnie az elemeket.

A HashSet és a Dictionary biztosítja a leggyorsabb kereséseket, mivel hasheléssel közel állandó idő alatt érik el az elemeket. Egy lista vagy tömb lassabb, mivel előfordulhat, hogy minden elemet sorban ellenőriznie kell.

Az egyidejű gyűjtemények a System.Collections.Concurrent névtérben találhatók, és többszálú kódhoz készültek. Az olyan típusok, mint a ConcurrentDictionary és a BlockingCollection, lehetővé teszik, hogy több szál biztonságosan hozzáadjon és eltávolítson elemeket manuális zárolások nélkül.

Az IEnumerable az alap interfész, amely csak foreach ciklussal támogatja az elemek olvasását. Az ICollection kiterjeszti ezt, és olyan tagokat ad hozzá, mint a Count, Add és Remove, így a gyűjtemény módosítását is támogatja.

A List egy általános, típusbiztos gyűjtemény, amely egy deklarált típust tárol, így fordítási idejű ellenőrzéseket és jobb teljesítményt biztosít. Az ArrayList nem általános, és minden elemet objektumként tárol, ami típusátalakítást igényel, és lehetővé teszi a vegyes típusokat.

A Stack (stack) az utolsó be, első ki sorrendben működik, tehát a legújabb elem kerül először eltávolításra a Pop (pop) paranccsal. A Queue (sorban állás) az első be, első ki sorrendben működik, tehát a legrégebbi elem kerül először eltávolításra a Dequeue (sorba helyezés) paranccsal.

Igen. A GitHub Copilot képes javaslatokat tenni a megfelelő gyűjteménytípusra, ciklusokat generálni, amelyek hozzáadnak vagy szűrnek elemeket, és LINQ lekérdezéseket végrehajtani egy rövid megjegyzésből, ami felgyorsítja a listákkal, szótárakkal és más gyűjteményekkel végzett munkát.

Az ML.NET olyan gyűjteményeken keresztül táplálja a betanítási adatokat, mint a List és az IEnumerable, amelyek az IDataView folyamatához vannak leképezve. A minták erősen típusos általános gyűjteményben történő tárolása átláthatóvá és típusbiztossá teszi a gépi tanulási munkafolyamatot.

Foglald össze ezt a bejegyzést a következőképpen: