posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

AddRange sulle collection

Purtroppo non c'è nessuna interfaccia che definisca AddRange sulle collection, quindi non c'è ICollection o IList che tenga.

A rimediare elegantemente ci pensano gli extension method che ci permettono di aggiungere AddRange in questo modo:

public static class CollectionExtension
{
    public static void AddRange<T>(this ICollection<T> list, IEnumerable<T> elements)
    {
        foreach (var e in elements)
            list.Add(e);
    }
}

Fatto questo, supponendo di avere una:  IList<qualcosa> collection = new ….;
basterà scrivere:  collection.AddRange(…);

IList infatti deriva da ICollection e quindi l'estensione di ICollection è la più appropriata.

Apparentemente si salva solo una riga di codice ma quando cominciate ad avere parecchio codice che usa Linq la pulizia di codice guadagnata fa una bella differenza.

Print | posted on lunedì 16 agosto 2010 16:40 |

Feedback

Gravatar

# re: AddRange sulle collection

Ciao Luca e prego.
Non c'è nessuna violazione. Gli extension method non alterano il contratto ma sono un semplice modo conveniente per usare in modo più naturale i più classici metodi helper statici.
Esporre IEnumerable<T>, ICollection<T> e IList<T> è una pratica comune e da 'best practice'. Questo 'obbliga' ad usare helper statici che possono essere resi ancora più leggibili grazie agli extension method.

Le altre soluzioni che hai esposto sono raramente applicabili. Estendere le suddette interfacce ad esempio rende complesso il deploy e obbliga l'implementazione di metodi come AddRange che invece sono implementabili in modo generico altrove. Le classi base devono essere usate con cautela, perché bruciarsi la gerarchia può non essere possibile o costare molto in futuro.
17/08/2010 02:39 | Raffaele Rialdi
Gravatar

# re: AddRange sulle collection

Ciao Raffaeu,
probabilmente stai facendo qualche errore perché funziona ovviamente sia su ICollection che IList (non ci sono motivi per non funzionare se il tipo concreto implementa la corrispondente interfaccia).
Controlla di nuovo (e nel caso specifica l'errore esatto).
17/08/2010 11:53 | Raffaele Rialdi
Gravatar

# re: AddRange sulle collection

Ciao Nicola e grazie a te.
Se usi NHibernate ottieni alla fine delle entities che a loro volta saranno probabilmente sottoposte ad altre query usando Linq to objects.
Appoggiarsi invece a un'interfaccia non presente nel framework può essere un vincolo inaccettabile perché potresti decidere in futuro di togliere NHibernate e metterci Entity Framework.
Prendiamo i pro nell'esporre IQueryable o IEnumerable:
- [pro IQ] IQueryable è built-in nel framework e quindi non comporta alcun requirement aggiuntivo (al contrario di ISet)
- [pro IE] D'altra parte la IEnumerable trasformata in IQueryable con l'extension method AsQueryable non ha alcun costo se l'oggetto era già un IQueryable.
- [pro IQ] maggiore leggibilità. Se non sai di avere una IQ e usi AsQueryable verrà creato un oggetto per wrappare il tuo. Magari avresti potuto evitare di usare AsQueryable e perciò avere per certo un oggetto IQ ti lascia più libero di usare i suoi membri.

Infine ricordiamoci sempre che qualsiasi modellazione facciamo, siamo sempre vincolati alla tecnologia che usiamo. Se modelli per C++ o per C# le decisioni *architetturali* che prendiamo possono essere radicalmente differenti, quindi tantovale rassegnarsi a plasmare il proprio modello sui requirements che abbiamo stabilito.
Il vantaggio di queste decisioni è certamente nel tempo uomo risparmiato, che dovrebbe essere sempre in cima alla lista, considerato che il cliente paga in funzione di questo.

A presto
06/09/2010 22:49 | Raffaele Rialdi
Gravatar

# re: AddRange sulle collection

Ok, Raffaele, penso di aver compreso tutta la faccenda.
Grazie ancora e complimenti per il tuo blog!
07/09/2010 11:43 | Nicola
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET