In a comment, Stuart Ballard wrote:

The general idea of a class that is usable both as a List and a Dictionary, maintaining an order and providing efficient access by both index and key, is a very useful one.

Althought it's not immediately obvious, the OrderedSet and OrderedBag collections can be used to do just that with just a small amount of work. An OrderedSet can be efficiently indexed just by using the indexer provided on the class. In addition, it can be used as an arbitrary (read-only) IList by simply calling the AsList method.

Now, it is true that an OrderedSet isn't really a dictionary. But, it can be used effectively as a dictionary by instantiating an OrderedSet>, and passing a Comparison delegate that compares keys only.

In retrospect, this could perhaps have been made even simpler by having an AsList method on OrderedDictionary that returned an IList>. I considered similar ideas but decided that they seemed too complicated and obscure. Maybe I was wrong.