Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Mannaggia alle IList e List

Una cosa che mi manca tanto dal C++ è la STL. In C++ la libreria STL è ben organizzata, soprattutto i contenitori; in .NET invece c'è un po' di confusione e di entropia. Prendiamo ad esempio la IList<T> e la List<T>. La seconda non è solamente una implementazione concreta di IList<T> perché ha veramente tanti metodi in più, questo fa si che lavorare con una IList<T> o con la sua diretta implementazione concreta fornita da microsoft sia differente. Personalmente avrei fatto si che la List<T> implementasse solamente i metodi di IList<T> lasciando ad un'altra classe i metodi aggiuntivi, oppure ancora meglio avrei dotato la IList di altri metodi. Un esempio:

Negli unit test spesso ho la necessità di comparare due entity solamente per una o due delle loro proprietà, ad esempio verificare se esiste in una Ilist un ordine con Id numero xxxX. Ora, nella List<T> io ho un metodo Exists(Predicate<T>) che amo molto perché mi ricorda un po la STL del C++ e il concetto di functional object e predicati, però purtroppo non esiste nella IList<T>, ok la sua implementazione è banale.

public static Boolean Exists<T>(IList<T> list, Predicate<T> criteria) {
   
for (Int32 index = 0; index < list.Count; ++index) {
      
if (criteria(list[index]))
         
return true;
   }
   
return false;
}

Ma non capisco perché il metodo Contains() non è stato fatto in due versioni, la classica e quella che accetta un predicate. Inoltre dato che è stato fatto un Predicate<T> avrei gradito anche un

public delegate Boolean BinaryPredicate<T>(T obj1, T obj2);
public delegate Boolean BinaryPredicate<T1, T2>(T1 obj1, T2 obj2);

Ovvero un paio di predicate binari, il primo che accetta due istanze di uno stesso tipo, il secondo che accetta istanze di due tipi differenti. Con questi due delegate si sarebbe potuto fare.

public static Boolean Exists<T>(IList<T> list, T element, BinaryPredicate<T> criteria) {
   
for (Int32 index = 0; index < list.Count; ++index) {
      
if (criteria(element, list[index]))
         
return true;
   }
   
return false;
}
public static Boolean Exists<T1, T2>(IList<T1> list, T2 element, BinaryPredicate<T1, T2> criteria) {
   
for (Int32 index = 0; index < list.Count; ++index) {
      
if (criteria(list[index], element))
         
return true;
   }
   
return false;
}

Sono buttate giù di getto, ma il concetto è questo: la IList<T> è una interfaccia fondamentale, molto usata soprattutto nella progettazione Domain Model per tenere traccia di una relazione uno a molti, e dotare questa interfaccia di funzioni di ricerca un po' più flessibili sarebbe stato indubbiamente meglio.

Quello che proprio non capisco è questo, in una pagina dell'msdn si legge: "Besides implementing IList<T>, the List<T> type contains many generic helper methods. These methods are designed to automate and streamline common tasks of working with the list, such as iterating over the list and performing" Non capisco perchè mai questi metodi non sono stati inseriti anche nella Ilist<T>. Sto dicendo delle sciocchezze oppure anche a voi è capitato di maledire la differenza tra IList<T> e List<T> ?? :D :D

Alk.

Print | posted on giovedì 18 ottobre 2007 10:50 | Filed Under [ .NET ]

Feedback

Gravatar

# Re: Mannaggia alle IList e List

a me invece quello che e' mancato quando ho iniziato a lavorare con le liste in .NET e' il confronto di liste per contenuti. ad esempio, sempre in un test mi e' comodo scrivere:

Assert.AreEqual( expectedList, fixture.GetAllXx() );

la soluzione piu' ovvia sarebbe stata quella di avere un asserter custom, ma a volte mi capita di voler implementare Equals() su oggetti di dominio confrontando anche liste, quindi ho optato per scrivermi una mia ExtendedList<T> e che sovrascrive Equals()..

ciao
-papo-
18/10/2007 12:28 | papo
Gravatar

# re: Mannaggia alle IList e List

Uso poco MbUnit, anche NUnit ha i collecitonassert ma valgono per le collection non generiche, cmq, quello che mi infastidisce non è tanto la mancanza delle funzioni, che si fanno in 15 min a mano, è proprio la differenza Tra IList e List :D. Cmq con il C# 3.0 e gli extension methods risolveremo :D

Alk.
19/10/2007 11:54 | Gian Maria
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET