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