Joren's answer is go-to, but if you need to maintain a consistent order for some other logic, And the name you want to associate with the object can be a member of this object, which can do a little Linq trick:
List<Foo> fooList = new List<Foo>;
Foo item = fooList.FirstOrDefault(f=>f.Name == "Foo Name");
"indexer" , :
public class MyList:List<Foo>
{
public Foo this[string name]
{
get { return this.FirstOrDefault(f=>f.Name == "Foo Name"); }
}
}
..., , ( )