我经常遇到的问题是需要以一种方式存储对象集合,以便我可以通过特定的字段/属性检索它们,该字段/属性是该对象的唯一“索引”。例如,我有一个名为
然而,这种方法似乎笨拙,并且在
也许有一些方法可以显式地确保我的
Person
的对象,其中name
字段是唯一标识符,我希望能够从某些Person
对象的集合中检索出name="Sax Russell"
的Person
。在Java中,我通常使用Map
来实现这一点,即我实际上想要一个Set
,并且始终将对象的“索引”字段用作其在映射中的键,即peopleMap.add(myPerson.getName(), myPerson)
。我想在C#中使用Dictionary
来做同样的事情,就像这样:class Person {
public string Name {get; set;}
public int Age {get; set;}
//...
}
Dictionary<string, Person> PersonProducerMethod() {
Dictionary<string, Person> people = new Dictionary<string, Person>();
//somehow produce Person instances...
people.add(myPerson.Name, myPerson);
//...
return people;
}
void PersonConsumerMethod(Dictionary<string, Person> people, List<string> names) {
foreach(var name in names) {
person = people[name];
//process person somehow...
}
}
然而,这种方法似乎笨拙,并且在
Dictionary
的键和值之间引入了松散耦合;我隐式地依赖于每个 Person
字典的生成者都将 Name
属性作为保存每个 Person
的键。我无法保证 people["Sax Russell"]
处的元素实际上是一个 Name="Sax Russell"
的 Person
,除非每次访问字典时都进行双重检查。也许有一些方法可以显式地确保我的
Person
对象集合通过名称进行索引,使用自定义的相等比较器和/或 LINQ 查询?查找时间必须保持恒定,这就是为什么我不能只使用 List.Find
或 Enumerable.Where
。我已经尝试使用 HashSet
并构造了一个只比较其给定对象的 Name
字段的相等比较器,但似乎没有任何办法只使用它们的名称检索 Person
对象。