Un problema che mi capita spesso di eseguire è la necessità di archiviare una raccolta di oggetti in modo tale da poterli recuperare da un particolare campo/proprietà che è un "indice" univoco per quell'oggetto. Ad esempio, ho un oggetto Person
per il quale il campo name
è un identificatore univoco e desidero poter recuperare da una raccolta di oggetti Person
il Person
di cui name="Sax Russell"
. In Java di solito ottengo questo risultato utilizzando uno Map
in cui effettivamente desidero uno Set
e sempre utilizzando il campo "indice" dell'oggetto come chiave nella mappa, ad esempio peopleMap.add(myPerson.getName(), myPerson)
. Stavo pensando di fare la stessa cosa in C# con Dictionary
s, in questo modo:Collezione C# indicizzata dalla proprietà?
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...
}
}
Tuttavia, questo sembra goffo, e introduce un accoppiamento piuttosto lasco tra le chiavi del Dictionary
e dei suoi valori; Dipendo implicitamente da ogni produttore di dizionari Person
utilizzando la proprietà Name
come chiave con cui memorizzare ogni Person
. Non ho alcuna garanzia che l'elemento a people["Sax Russell"]
sia in realtà un Person
con Name="Sax Russell"
a meno che non ricontrollo ogni volta che accedo al dizionario.
Potrebbe esserci un modo per garantire esplicitamente che la mia raccolta di oggetti Person
sia indicizzata per nome, utilizzando comparatori di uguaglianza personalizzati e/o query LINQ? È importante che la ricerca rimanga costante, motivo per cui non posso semplicemente usare List.Find
o Enumerable.Where
. Ho provato a utilizzare un HashSet
e a costruirlo con un comparatore di uguaglianza che confronta solo il campo Name
degli oggetti che gli vengono assegnati, ma non sembra esserci alcun modo per recuperare gli oggetti Person
usando solo il loro nome.
Proprio imbattuto in questo, ma hai considerato i [KeyedCollection] (https: //msdn.microsoft.com/en-us/library/ms132438(v=vs.110).aspx) classe? – ygoe