a) wie bereits gesagt sollten statt ArrayList generische Listen verwendet werden.
Ansonsten lässt sich das ganze auch als Dreizeiler ausdrücken:
public List<string> Split(string input)
{
var ignoredChars = new[] {"!", ".", ",", "?", "\n"};
var words = input.Split(new[] {" "}, StringSplitOptions.RemoveEmptyEntries);
return words.Where(x => !ignoredChars.Contains(x)).ToList();
}
Die String.Split Methode kann selbstständig leere Einträge herausfischen und die Where Methode sammelt dann alles auf, was nicht einem der ignorierten Chars entspricht. Falls es unbedingt ne Array List sein _muss_ kann man das Ergebnis der Methode auch in ne ArrayList stecken - return new ArrayList(words.Where(...));