Foreach isn't as efficient as for statements - off the top of my head I can't recall why, aside from the fact that you have to do some work at run time to figure out what's going on (could be wrong there - I'll link to some more detailed information in a bit). In some cases it doesnt matter much, but when you try using it for anything substantial you get a big boost from using a less generic loop - the cited example tends to involve strings, from what I recall.
Edit - so, after a bit of digging to refresh my memory, here's what I've got: a foreach (usually) sits on top of a collection, whereas a for loop does not. When you go to compile, the for loop is more efficient because there are fewer compares going on in the assembly (
http://www.codeproject.com/KB/cs/foreach.aspx).
The string examples I referred to above were from MSDN about a decade ago, so I'm not sure if they still hold true in .NET 4.0 (I suspect many of the early reasons resulting from poor compiler optimization have since been fixed -
http://blogs.msdn.com/b/kevin_ransom/archive/2004/04/19/116072.aspx), but the page is still posted and plenty of code is still in early versions of .NET, so it's not a bad bit of advice (
http://msdn.microsoft.com/en-us/library/ms973839.aspx#dotnetperftips_topic2).
In newer versions of .NET the verdict seems mixed (there's some great discussion on stackoverflow
http://stackoverflow.com/questions/365615/in-net-which-loop-runs-faster-for-or-foreach) but basically if you want to hit everything in a collection, especially when you aren't sure what type of collection, a foreach has near negligible differences from a for loop. However, when you try using it on an indexed array or certain other situations you take a big performance hit. It also has certain limitations in what you can do, which a for loop doesn't - I think (but am not certain) that you can't modify the contents of the collection in such a way as to alter the array bounds or order (it would throw an exception for resizing/reordering your collection while iterating on it... which is a problem).
If you want to see some benchmarks,
http://msmvps.com/blogs/jon_skeet/archive/2009/01/29/for-vs-foreach-on-arrays-and-lists.aspx has a brief test - but limited, in that it only tests an int array against a List<int> to see what happens, which is pretty limited compared to the full spectrum of possibilities out there. That said, it's not a bad test, and it does a pretty good job illustrating the point.
By no means is the above definitive, but it appears to be a good summary of the current consensus. Basically, foreach is generic, and you're going to pay a price for that in terms of optimization on less common circumstances, so in most cases there are better ways to loop or iterate through a list/array/whatever of objects.