Какую структуру данных использовать для хранения двух значений? - PullRequest
5 голосов
/ 11 декабря 2011

Например, у меня в приложении есть список типа, который имеет имя лица в качестве имени и содержит два значения. Имя типа - это имя человека, а тип содержит только их возраст и количество стандартных имен.

Моя первая идея состояла в том, чтобы создать класс свойств Persons с Age и NumStds, для которых в конструкторе требуются Age и NumStds, и создать список, к которому я могу добавить.

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

Мне было просто интересно, есть ли структура данных, в которой я мог бы просто ссылаться на элементы в Списке <> по их Имени и иметь прикрепленные к ним свойства, которые можно использовать для поездки. Как я мог сказать

people.Remove(Julie) 

Ответы [ 4 ]

5 голосов
/ 11 декабря 2011

Похоже, вы ищете словарь .

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

Другой вариант - System.Collections.ObjectModel.KeyedCollection .Это требует немного больше работы для реализации, но может быть полезно.

Чтобы сделать эту работу, создайте класс коллекции для person и переопределите метод GetKeyForItem:

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

Затем вы можете добавитьэлементы в коллекции, как в вашем примере:

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

Затем удалить элемент:

peoples.Remove("Julie");
1 голос
/ 11 декабря 2011

Я не уверен в ваших требованиях, но, просто посмотрев на ваш оператор Remove () в конце вашего сообщения, вы можете получить тот же эффект с выражением linq.

people.Remove(p => string.Compare(p.Name, "Julia", true) == 0);
1 голос
/ 11 декабря 2011

Взгляните на класс KeyedCollection .

KeyedCollection Класс

Предоставляет абстрактный базовый класс для коллекции, ключи которой встроены в значения.

Вы должны получить свой собственный класс коллекции из этого абстрактного класса, например,

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

Пример:

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

Обратите внимание, что свойство Name вашего класса Person должно быть неизменным (только для чтения).

0 голосов
/ 20 декабря 2015

Проблема с использованием Dictionary<string, Person> для этого заключается в том, что у вас может быть ключ, который не совпадает с именем человека. Этого можно избежать, но я бы лучше использовал HashSet<Person> для работы. Производительность такая же.

Вам нужно только подготовить свой класс, переопределив GetHashCode для возврата хэш-кода Имени.

public override int GetHashCode()
{
    return Name.GetHashCode();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...