Collections, List<T> vs. Collection<T>, alebo čo mi doteraz uchádzalo :-)

Občas sa stane, že potrebujete byť notifikovaný o tom, že collection bola modifikovaná. V .NET framework 1.1 to bolo jasné. Rozumne ste ako milovníci typovej bezpečnosti podedily z CollectionBase a do metód ste prípadne dopísali, čo ste potrebovali. Bola to síce slušná nadpráca, ale jednoduchý generátor problém hravo vyriešil.

.NET Framework 2.0 priniesol revolučné Generic-ky a s nimi aj Generic Collections resp. List<T>. Lenže nemá ani virtual ani protected metódu, kam by sa dalo dopísať napr. fireoveanie nejakého eventu pri nejakej zmene v collection. Jasné, je "lightweight". Rozumné rozhodnutie, ak by existovala nejaká ďalšia alternatíva, iná, ako si krvopotne doimplementovať observer/proxy wrapper cez ICollection<T> alebo IList<T> interface nad Listom, keď chce človek trochu zmodifikovať behaviour. Naštastie existuje. Nájdeme ju v namespace System.Collection.ObjectModel v podobe bohatšej generickej Collection<T>, alertnatívnej ku "lightweight" List<T> v System.Collection.Generic. Obe triedy dedia totožné interfaces IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable.

Pri Collection<T> máme k dispozícii tento set protected virtual metód

  • ClearItems - Vymazanie všetkých položiek
  • InsertItem - Vloženie položky na pozíciu v collection určenú indexom
  • RemoveItem - Vymazanie položky so zvoleným indexom v collection
  • SetItem - Náhrada položky so zvoleným indexom v collection

Okrem nej v rámci namespace System.Collection.ObjectModel na nás čakajú ďalšie dve praktické triedy: KeyedCollection a ReadOnlyCollection. Ano, človek občas urobí príjemne objavy, ktoré ho potešia a s radosťou docení stvoriteľa :-)

  • Collection - bázová trieda pre generické collections.
  • KeyedCollection - abstraktná bázová trieda pre collections, ktorých kľúč je súčasťou hodnoty
  • ReadOnlyCollection - bázová trieda pre generické read-only collections.

Veľmi pekné/praktické príklady na využitie KeyedCollection nájdeme v MSDN

.NET Framework 3.0 prináša vrámci namespace System.Collection.ObjectModel ešte bohatšiu bázovú collection ObervableCollection, ktorá má implementovaný interface INotifyCollectionChanged, cez ktorý expozuje event CollectionChanged. vďaka ktorému môžeme sledovať všetky zmeny nad collection a patrične na ne reagovať...kam sa to až ubralo, od starých CollectionBase čias, však? :-)

P.S. Tento príspevok nemá ambíciu suplovať MSDN :-)

Bookmark and Share

Komentáre

Bez komentárov

Prihlásiť | Registrovať | Pomoc