Универсальные коллекции, безусловно, предпочтительнее из-за их выразительности. При переходе от неуниверсальных коллекций следует помнить одну вещь: иногда поведение может отличаться от ожидаемого. Например, использование индексатора в Hashtable vs. Dictionary будет действовать по-разному для значений, которых нет. Hashtable вернет ноль, в то время как Dictionary выдаст.
Hashtable ht = new Hashtable();
ht.Add(1, "one");
string s1 = ht[1; // s1="one"
string s2 = ht[2]; // s2=null
var dic = new Dictionary<int, string>();
dic.Add(1, "one");
string s1 = dic[1]; // s1="one"
string s2 = dic[2]; // throws KeyNotFoundException
Обычный способ справиться с этим - использовать следующую технику:
string s = null;
if (dic.TryGetValue(k, out s))
{
// if we're here, k was found in the dictionary
}
Это будет отображаться только во время выполнения, поэтому об этом стоит знать заранее.