Correct. I am not sure how java hotspot stacks up these days either, but I know the CLR JIT stagnated for many years. Simple things we have had in C++ for decades, such as temporary object elimination, were never added, except recently for structs in some
cases. Here is the latest I could find discussing it: http://blogs.sun.com/jrose/entry/bravo_for_the_dynamic_runtime
In regards to a "good" library versus a "bad" one: ease of learning is the most important aspect, inversely proportional to size and complexity.
Regarding IEnumerable: "Abstraction and Specification in Program Development," by Liskov and Guttag, published in 1980, discussed implementing iterators in Clu. IEnumerable is the CLR equivalent of iterators. It is nice to see these ideas make their way
into common high level languages, but it is hardly a new concept.
IEnumerable is specific kind of iterator, a forward iterator. Forward iterators have linear complexity for searching. Hence why Linq to Objects has linear complexity.