我經常碰到的一個問題是需要以這樣一種方式存儲對象集合,以便我可以通過特定的字段/屬性(它是該對象的唯一「索引」)來檢索它們。例如,我有一個Person
對象,其中name
字段是唯一標識符,並且我希望能夠從某個Person
對象集合中檢索Person
的對象name="Sax Russell"
。在Java中,我通常通過使用Map
來實現這一點,其中我實際上需要Set
,並始終使用對象的「索引」字段作爲其在映射中的鍵,即peopleMap.add(myPerson.getName(), myPerson)
。我想用Dictionary
在做在C#同樣的事情,就像這樣:按屬性索引的C#集合?
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 : names) {
person = people[name];
//process person somehow...
}
}
然而,這似乎笨拙,並介紹了Dictionary
和值的鍵之間的相當鬆散的耦合;我隱含地依靠每個Person
字典的生產者使用Name
屬性作爲存儲每個Person
的密鑰。我不能保證people["Sax Russell"]
的元素實際上是Person
和Name="Sax Russell"
,除非我每次訪問字典時都仔細檢查。
可能有某種方法可以使用自定義相等比較器和/或LINQ查詢來明確確保我的集合中的Person
對象按名稱編入索引?查找保持恆定時間非常重要,這就是爲什麼我不能只使用List.Find
或Enumerable.Where
。我嘗試過使用HashSet
並使用相等比較器構造它,該比較器只比較它給出的對象的Name
字段,但似乎沒有任何方法可以使用它們的名稱來檢索Person
對象。
只是偶然發現了這一點,但你有沒有考慮到[KeyedCollection(HTTPS: //msdn.microsoft.com/en-us/library/ms132438(v=vs.110).aspx)class? – ygoe