gli arrayList sono Array dinamici, io li preferisco quando non conosco le grandezze della struttura a priori.

per quanto riguarda i cicli........
citando la teoria:

for quando si conosce a priori il numero di iterazioni
per ordinare un array so che lo devo scorrere comunque tutto

foreach idem su collection o IEnumerable

while quando non conosco il numero di iterazioni
per cercare un dato, mi fermo appena l'ho trovato

ma questa è solo teoria.

In pratica, vai a vedere Generics e IEnumeradble<>. Trovi molta documentazione e puoi sfruttare le potenzialità del nuovo framework, ad esempio List<int> per una lista dinamica di interi (migliori performance).


Citazione:
The primary difference is that the extension methods defined for IQueryable<T> take Expression objects instead of Func objects, meaning the delegate it receives is an expression tree instead of a method to invoke. IEnumerable<T> is great for working with in-memory collections, but IQueryable<T> allows for a remote data source, like a database or web service. I walk through these differences in this article: C# 3.0 and LINQ .