我经常遇到的一个问题是需要以这样一种方式存储对象集合,以便我可以通过作为该对象的唯一“索引”的特定字段/属性来检索它们。例如,我有一个字段是唯一标识符的Person对象name,我希望能够从某些Person对象集合中检索Person其name="Sax Russell". 在 Java 中,我通常通过Map在我真正想要的地方使用 a 来完成此操作Set,并且始终使用对象的“索引”字段作为其在映射中的键,即peopleMap.add(myPerson.getName(), myPerson). 我想在 C# 中用Dictionarys 做同样的事情,像这样:
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. 我不能保证 at 的元素people["Sax Russell"]实际上是Personwith ,Name="Sax Russell"除非我每次访问字典时都仔细检查。
是否有某种方法可以使用自定义相等比较器和/或 LINQ 查询显式确保我的Person对象集合按名称索引?查找保持恒定时间很重要,这就是为什么我不能只使用List.Findor Enumerable.Where。我已经尝试使用 aHashSet并使用相等比较器构造它,该比较器仅比较Name给定对象的字段,但似乎没有任何方法可以Person仅使用对象名称来检索对象。