Collezioni e generics

Visto che al Real Code Day abbiamo parlato di collezioni tipizzate e, in particolare, delle interfacce che una collezione deve implementare e della classe astratta CollectionBase, mi sembrava interessante proporre questa tabellina riassuntiva che mette in evidenza la corrispondenza dei tipi relativi al namespace System.Collection della versione 1.x del framework e i nuovi tipi Generics della versione 2.0.

In particolare mi piace sottolineare la corrispondenza che esiste tra CollectionBase e Collection<T> e tra ArrayList e List<T>.

Il tipo List<T> corrisponde all'ArrayList tipizzato nella versione Generics. La collezione generica per la realizzazione di collezioni tipizzate con la versione 2.0 del framework è Collection<T> che equivale alla precedente CollectionBase (anche se non è astratta) e che utilizza un List<T> internamente per contenere l'elenco di dati.

Collection<T> implementa le interfacce ICollection, IList, IEnumerable, ICollection<T>, IList<T>, IEnumerable<T> ed è espressamente pensata per essere la classe base per le collezioni tipizzate nella versione 2.0. List<T> implementa le stesse interfacce ed un tipo che espone una marea di metodi per l'ordinamento, la ricerca e la manipolazione dei dati in esso contenuti. Collection<T> ha una interfaccia più snella e funge da wrapper per l'oggetto List<T> incapsulato.

Come dice anche il buon Andrea, l'interfaccia di List<T> è dichiarata da Microsoft stessa troppo ricca per le API pubbliche, quindi per proprietà e metodi (argomenti, return value) bisognerebbe usare sempre Collection<T>.

System.Collections

System.Collections.Generic
System.Collections.ObjectModel

Le interfacce

IEnumerator

IEnumerator<T>

IEnumerable

IEnumerable<T>

ICollection

ICollection<T>

IList

IList<T>

IDictionary

IDictionary<K,V>

Le collezioni ICollection<T>

Stack

Stack<T>

Queue

Queue<T>

Le collezioni IList<T>

System.Array

System.Array [*]

ArrayList

List<T>

StringCollection

List<string>

---

LinkedList<T>

CollectionBase

Collection<T>

ReadOnlyCollectionBase

ReadOnlyCollection<T>

Le collezioni IDictionary<T>

HashTable, DictionaryBase, HybridDictionary, ListDictionary

Dictionary<K,V>

StringDictionary

Dictionary<string,string>

SortedList

SortedDictionary<K,V>

NameObjectCollectionBase

SortedDictionary<string,object>

NameValueCollection

SortedDictionary<string,string[]>

Comparazione

System.IComparable

IComparable<T>

Comparer

Comparer<T>

[*] In System.Array sono stati aggiunti numerosi metodi generici per elaborare in modo tipizzato i vettori.

Ringrazio (luKa) e Andrea per il confronto di idee. ;)

Nella stessa categoria

Commenti
imperugo scrive:
Collezioni e generics

ops, ma sono stato io a fare sta cosa con tutti i post sul forum , spero di no, però è troppo fica sta tabellina mitico ricky
08/11/2005 ore 11.00 | 2 risposte
»»»» rickyvr scrive:
Re: Collezioni e generics

Si, in realtà ho preso spunto dal tuo post!

Ma dato che sto già pensando al Real Code Day 2, hai già capito anche quale potrebbe essere uno degli argomenti...

Ciao, Ricky.
08/11/2005 ore 11.24
imperugo scrive:
Re: Collezioni e generics

Allora ho "studiato" ciò che hai scritto nel messaggi e mi sono riposto delle domande su come implemntare una situazione tipo che si può verificare in una collecition, ma non ne sono venuto a capo, del tipo

prendiamo un entità come la seguente

int ID
int Nome
entity_city City

a seguire l'entità entity_city espone pubblicamente

int ID
int Nome
int Cap

quindi dall'entita precedente poteri fare myIdentity.City.ID / Nome / Cap

se volessi fare una select implementando Collection<T> come hai detto tu sopra, una select tipo questa:


public myCollection<T> Select (entity_city _City)
{

for (int i=0; i< base.Items.Count; i++)
{
if(base.Item[i].City.Cap == City.Cap)
{
///esegui del codice
}
}
}


Tu in un post mi hai detto giustamente devi dire alla collection che T implementa un entity_city e devi farlo tramite il constrains di un intefaccia.
Ok ma in questo caso devo preparaemi una collection generica per tutte quelle entità che implementano la mia interfaccia che espone entity_city?
In caso la risposta fosse negativa posso dire al parametro della funzione _City che è un tipo generico ma non di tipo T?

Diciamo che ho "risolto" momentaneamente realizzando una collection per ogni tipo che espone entity_city, ma in questo caso che generics sono?

Spero di non aver esagerato con la domanda ma era bello capire fino a che punto si posso spingere i generics.

byez
10/11/2005 ore 0.11

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.

© 1998-2008 - Ricky.NET - Il blog di Riccardo Golia

TagCloud
BLOG INFO
  • Post: 165
  • Commenti: 104
  • TrackBacks: 63
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML

MVP
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA