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.