2011-12-11 7 views
5

Ad esempio, ho nella mia applicazione un elenco di un tipo che ha un nome di persona come nome e contiene due valori. Il nome del tipo è il nome delle persone e il tipo contiene solo la loro età e il numero di std.Qual è una buona struttura dati da usare per contenere due valori?

La mia prima idea era di creare una classe di proprietà People with Age e NumStds in cui Age e NumStds sono obbligatori nel costruttore e creare un elenco a cui posso aggiungere.

class Person 
{ 
    public string Name { get; set; } 
    public int NumSTDs { get; set; } 
    public int Age { get; set; } 

    public Person(string name, int age, int stds) 
    { 
     Name = name; 
     Age = age; 
     NumSTDs = stds; 
    } 
} 

static void Main(string[] args) 
{ 
    List<Person> peoples = new List<Person>(); 
    peoples.Add(new Person("Julie", 23, 45)); 
} 

Mi stavo chiedendo se esiste una struttura di dati in cui ho potuto solo fare riferimento agli elementi nella lista <> con il loro nome e hanno le proprietà ad essi venire per il lungo viaggio. Come potrei dire

people.Remove(Julie) 
+2

Cosa succede se ci sono due persone con lo stesso nome? – TrueWill

risposta

1

Dai un'occhiata allo KeyedCollection<TKey, TValue> Class.

KeyedCollection < TKey, TValue > Classe

Fornisce la classe base astratta per una collezione le cui chiavi sono incorporati nei valori.

È necessario derivare la propria classe di raccolta da questa classe astratta, ad es.

class PersonCollection : KeyedCollection<string, Person> 
{ 
    protected override string GetKeyForItem(Person item) 
    { 
     return item.Name; 
    } 
} 

Esempio:

static void Main(string[] args) 
{ 
    var peoples = new PersonCollection(); 
    var julie = new Person("Julie", 23, 45) 
    peoples.Add(julie); 

    people.Remove(julie); 
    // - or - 
    people.Remove("Julie"); 
} 

Nota che la proprietà nome della classe Person dovrebbe essere immutabile (sola lettura).

+0

Woo hoo !! Grazie: D –

5

Sembra che tu stia cercando uno Dictionary.

Dictionary<string, Person> peoples = new Dictionary<string, Person>(); 
Person oPerson = new Person("Julie", 23, 45); 
peoples.Add(oPerson.Name, oPerson); 

Un'altra opzione è System.Collections.ObjectModel.KeyedCollection. Questo richiede un po 'più di lavoro da implementare, ma può essere utile.

per fare questo lavoro, creare una classe di raccolta per la persona e l'override del metodo GetKeyForItem:

public class PersonCollection : System.Collections.ObjectModel.KeyedCollection<string, Person> 
{ 
    protected override string GetKeyForItem(Person item) 
    { 
     return item.Name; 
    } 
} 

Quindi è possibile aggiungere elementi alla raccolta, come nel tuo esempio:

PersonCollection peoples = new PersonCollection(); 
peoples.Add(new Person("Julie", 23, 45)); 

Poi rimuovere l'articolo:

peoples.Remove("Julie"); 
1

Non sono sicuro delle vostre esigenze, ma osservando l'istruzione Remove() alla fine del post, è possibile ottenere lo stesso effetto con un'espressione linq.

people.Remove(p => string.Compare(p.Name, "Julia", true) == 0); 
+2

Usa una stringa.Equalite() invece di una stringa.Compare() – slugster

0

Il problema con l'utilizzo di un Dictionary<string, Person> di questo è che si può avere una chiave che non corrisponde al nome della persona. Questo può essere evitato, ma preferirei usare un HashSet<Person> per il lavoro. La performance è la stessa.

È necessario preparare la classe solo ignorando GetHashCode per restituire il codice hash di Nome.

public override int GetHashCode() 
{ 
    return Name.GetHashCode(); 
} 
Problemi correlati