C# Collections Tutorial s příklady

⚡ Chytré shrnutí

Kolekce v jazyce C# poskytují flexibilní způsob ukládání a správy skupin objektů. Na rozdíl od polí se kolekce za běhu zvětšují a zmenšují a jmenné prostory System.Collections a System.Collections.Generic poskytují hotové typy pro seznamy, slovníky, zásobníky a fronty.

  • 🔃 Dynamické dimenzování: Kolekce přidávají a odebírají prvky za běhu, takže jejich velikost není předem pevně stanovena jako u pole.
  • ???? jmenné prostory: System.Collections obsahuje negenerické typy, zatímco System.Collections.Generic obsahuje typově bezpečné generické typy.
  • 🧱 Základní kurzy: ArrayList, Stack, Queue, Hashtable, SortedList a BitArray pokrývají běžné negenerické potřeby.
  • (Tj. Generický výkon: Seznam, slovník, hašovací sada a fronta přidávají bezpečnost typů během kompilace a lepší výkon.
  • 🔑 Správná volba: Pro vyhledávání klíčů použijte slovník, pro seřazené položky seznam a pro pořadí LIFO nebo FIFO zásobník nebo frontu.
  • 🤖 Asistence AI: GitHub Copilot vytváří scaffoldingový kód kolekce a kanály ML.NET předávají data prostřednictvím generických typů kolekcí.

Kolekce v C#

V našem předchozím tutoriálu jsme se naučili, jak můžeme používat pole v C#. Udělejme si o tom rychlý přehled, pole v programování se používají k seskupování množiny souvisejících objektů. Dalo by se tedy vytvořit pole nebo sadu celých čísel, ke kterým by bylo možné přistupovat pomocí jednoho názvu proměnné.

Co jsou kolekce v C#?

Sbírky jsou podobné jako Pole, poskytuje flexibilnější způsob práce se skupinou objektů.

V polích byste si všimli, že musíte předem definovat počet prvků v poli. To muselo být provedeno při deklaraci pole.

Ve sbírce však nemusíte předem definovat velikost kolekce. Můžete přidávat prvky nebo dokonce prvky z kolekce kdykoli odebírat. Tato kapitola se zaměří na to, jak můžeme pracovat s různými kolekcemi dostupnými v C#.

Třídy System.Collections

Rozhraní .NET Framework seskupuje původní negenerické třídy kolekcí v rámci jmenného prostoru System.Collections. Následující tabulka shrnuje hlavní typy, které můžete ihned použít.

Sbírka Description
ArrayList Kolekce ArrayList je podobná Arrays datový typ v C#. Největším rozdílem je dynamická povaha kolekce seznamů polí.
Stoh Zásobník je speciální kolekce případů, která představuje koncept „poslední dovnitř, první ven“ (LIFO).
fronty Fronta je speciální kolekce případů, která představuje koncept „first in first out“.
Hashtable Hašovací tabulka je speciální kolekce, která se používá k ukládání položek typu klíč-hodnota.
SortedList SortedList je kolekce, která ve výchozím nastavení ukládá páry klíč-hodnota ve vzestupném pořadí klíče.
BitArray Bitové pole je pole datových struktur, které ukládá bity.

Generické kolekce v C#

Výše uvedené negenerické třídy ukládají každý prvek jako obecný objekt, což znamená, že kompilátor nemůže kontrolovat typ a program platí malý poplatek za zabalení hodnot. Aby se tento problém vyřešil, C# přidal jmenný prostor System.Collections.Generic, kde je každá kolekce vázána na jeden deklarovaný typ.

Obecná kolekce, jako například List Přijímá pouze řetězce, takže chyby se zachytí při kompilaci a při zpětném čtení položky není nutné přetypování. Díky tomu jsou generické kolekce bezpečnější, rychlejší a snáze čitelné, a proto jsou v moderním kódu C# výchozí volbou.

Nejběžnější generické kolekce jsou uvedeny níže:

  • Seznam : Seznam založený na indexech s možností změny velikosti, generická náhrada za ArrayList.
  • Slovník : Ukládá páry klíč-hodnota s rychlým vyhledáváním založeným na hashování.
  • Hašovací sada : Uchovává pouze jedinečné hodnoty a podporuje operace s množinami, jako je například sjednocení.
  • Fronta : Kolekce typu „first in first out“, generická verze Queue.
  • Stoh : Kolekce typu „poslední dovnitř, první ven“, generická verze Stacku.
  • Seřazený seznam : Udržuje páry klíč-hodnota seřazené vzestupně podle klíče.

Příklad kolekce seznamů v jazyce C#

Seznam je nejpoužívanější generická kolekce, protože se chová jako dynamické pole. Následující příklad vytváří seznam řetězců, přidává a odebírá položky, čte jeho velikost a poté vypisuje zbývající hodnoty. Veškerý kód je napsán v souboru Program.cs.

Krok 1) Importujte jmenný prostor System.Collections.Generic a deklarujte seznam řetězců.

Krok 2) Položky přidáte metodou Add a jednu odstraníte metodou Remove.

Krok 3) Přečtěte vlastnost Count a poté projděte seznam pomocí příkazu 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 Vysvětlení:-

  1. Jmenný prostor System.Collections.Generic je importován, takže program má k dispozici typ List.
  2. Nový seznam s názvem tutoriály se vytvoří a pomocí metody Add se přidají tři názvy.
  3. Metoda Remove odstraní hodnotu „Python“, což v seznamu ponechává dvě položky.
  4. Vlastnost Count vrací počet položek a smyčka foreach vypíše všechny zbývající hodnoty v pořadí.

Když program běží, nejprve vypíše počet 2, následován Java a Kotlin na samostatných řádcích. Toto ukazuje, jak kolekce mění svou velikost za běhu, což fixní pole nedokáže.

Rozdíl mezi poli a kolekcemi v C#

Oba an řada a kolekce seskupuje související položky pod jedním názvem, přesto se po spuštění programu chovají odlišně. Vědět, kdy kterou položku použít, vám pomůže psát čistší a efektivnější kód.

Hlavní rozdíly jsou uvedeny níže:

  • Velikost: Pole má pevnou délku nastavenou při deklaraci, zatímco kolekce se může kdykoli zvětšovat nebo zmenšovat.
  • Zpracování typů: Pole ukládá jeden typ, zatímco kolekce může být typově bezpečná s generiky nebo může obsahovat objekty smíšených typů, pokud nejsou generické.
  • pronájem: Pole jsou zabudována do jazyka, zatímco třídy kolekcí se nacházejí ve jmenných prostorech System.Collections a System.Collections.Generic.
  • Vestavěné operace: Kolekce nabízejí hotové metody pro přidávání, odebírání, vyhledávání a řazení položek, zatímco pole poskytují pouze základní indexovaný přístup.
  • Nejlepší využití: Vyberte pole, pokud je počet položek známý a pevný, a kolekci, pokud se počet mění během běhu programu.

Stručně řečeno, pole jsou nejlepší pro data s pevnou velikostí, zatímco kolekce poskytují flexibilitu, kterou většina reálných aplikací potřebuje.

Nejčastější dotazy

Použijte slovník, když potřebujete rychlé vyhledávání podle jedinečného klíče, například ID namapovaného na záznam. Najde hodnoty v téměř konstantním čase, zatímco seznam musí prohledávat položky jednu po druhé.

HashSet a Dictionary poskytují nejrychlejší vyhledávání, protože používají hashování k dosažení prvku v téměř konstantním čase. Seznam nebo pole je pomalejší, protože může být nutné kontrolovat každý prvek v pořadí.

Souběžné kolekce se nacházejí v oboru názvů System.Collections.Concurrent a jsou vytvořeny pro vícevláknový kód. Typy jako ConcurrentDictionary a BlockingCollection umožňují několika vláknům bezpečně přidávat a odebírat položky bez ručního uzamčení.

IEnumerable je základní rozhraní, které podporuje čtení položek pouze pomocí smyčky foreach. ICollection ho rozšiřuje a přidává členy jako Count, Add a Remove, takže také podporuje úpravu kolekce.

List je generická, typově bezpečná kolekce, která ukládá jeden deklarovaný typ, což umožňuje kontroly během kompilace a lepší výkon. ArrayList je negenerická a ukládá každou položku jako objekt, který vyžaduje přetypování a umožňuje smíšené typy.

Stack funguje v pořadí „poslední dovnitř, první ven“, takže nejnovější položka je odstraněna jako první pomocí funkce Pop. Queue funguje v pořadí „první dovnitř, první ven“, takže nejstarší položka je odstraněna jako první pomocí funkce Dequeue.

Ano. GitHub Copilot dokáže navrhnout správný typ kolekce, generovat smyčky, které přidávají nebo filtrují položky, a dokončovat dotazy LINQ z krátkého komentáře, což urychluje práci se seznamy, slovníky a dalšími kolekcemi.

ML.NET dodává trénovací data prostřednictvím kolekcí, jako jsou List a IEnumerable, které se mapují na jeho kanál IDataView. Ukládání vzorků do silně typované generické kolekce udržuje pracovní postup strojového učení přehledný a typově bezpečný.

Shrňte tento příspěvek takto: