2011-12-11 14 views
5

Por ejemplo, tengo en mi aplicación una lista de un tipo que tiene el nombre de una persona como su nombre y contiene dos valores. El nombre del tipo es el nombre de las personas y el tipo contiene solo su edad y número de std.¿Cuál es una buena estructura de datos para usar para contener dos valores?

Mi primera idea fue crear una clase de propiedades Personas con edad y NumStds donde se requieren Age y NumStds en el constructor y crear una Lista a la que pueda agregar.

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)); 
} 

Me preguntaba si hay una estructura de datos en que sólo podía referirse a los elementos en la Lista <> por su nombre y tienen las propiedades adjuntas vienen en el viaje. Como podría decir

people.Remove(Julie) 
+2

¿Qué pasa si hay dos personas con el mismo nombre? – TrueWill

Respuesta

1

Eche un vistazo a KeyedCollection<TKey, TValue> Class.

KeyedCollection < TKey, TValue > Clase

Proporciona la clase base abstracta para una colección cuyas claves están incrustados en los valores.

Debe derivar su propia clase de colección de esta clase abstracta, p. Ej.

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

Ejemplo:

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"); 
} 

Tenga en cuenta que la propiedad Nombre de la clase de persona debe ser inmutable (sólo lectura).

+0

Woo hoo !! Gracias: D –

5

Parece que usted está buscando Dictionary.

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

Otra opción es System.Collections.ObjectModel.KeyedCollection. Esto requiere un poco más de trabajo para implementar, pero puede ser útil.

para hacer este trabajo, cree una clase de colección para la persona y reemplazar el método GetKeyForItem:

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

continuación, puede añadir elementos a la colección como en el ejemplo:

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

A continuación, a eliminar el elemento:

peoples.Remove("Julie"); 
1

No estoy seguro de sus requisitos, pero simplemente mirando su declaración Remove() al final de su publicación, podría obtener el mismo efecto con una expresión linq.

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

Use un string.Equals() en lugar de una cadena.Compare() – slugster

0

El problema de usar un Dictionary<string, Person> de esto es que usted puede tener una clave que no coincide con el nombre de la persona. Esto se puede evitar, pero prefiero usar un HashSet<Person> para el trabajo. El rendimiento es el mismo.

Solo debe preparar su clase anulando GetHashCode para devolver el código hash de Nombre.

public override int GetHashCode() 
{ 
    return Name.GetHashCode(); 
} 
Cuestiones relacionadas