Какова правильная реализация «составного» типа переменной? - PullRequest
4 голосов
/ 01 апреля 2011

У меня есть программа, которая должна управлять объектами с помощью составного ключа.этот ключ, чтобы быть простым, это пара строк.

У меня есть следующий код:

public struct MyKey
{
    public string Part1 { get; set;} // always set
    public string Part2 { get; set;} // can be null
    public MyKey(string part1, string part2) : this()
    {
        this.Part1 = part1;
        this.Part2 = part2;
    }
}

это нормально для хранения моих значений.

Теперь я хочучтобы иметь возможность:

  • использовать оператор равенства (part1 и part2 равны)
  • использовать ключ в словаре, особенно для использования метода Contains

Я угадал несколько вещей (переопределить оператор equals, переопределить методы GetHashCode и Equals, реализовать IComparable и т. Д.), Но я не уверен, каковы необходимые шаги для достижения моих целей и что вызовет издержки.

спасибо заранее

Ответы [ 3 ]

6 голосов
/ 01 апреля 2011

Используйте .NET 4.0 Tuple, он имеет правильные значения Equals() и GetHashCode() на основе значений компонентов.Я использовал Tuple раньше или если они являются строковыми ключами, вы всегда можете заключить их в разделитель, но если вы действительно хотите сохранить этот класс в качестве ключа, вам нужны соответствующие Equals () и GetHashCode (), поэтому в этом случаеYourType внедряет IEqualityComparer<YourType>.

ps. Вот хороший пример переопределения GetHashCode (), если вы хотите сделать это вручную вместо Tuple ...

Что лучшеалгоритм для переопределенного System.Object.GetHashCode?

1 голос
/ 01 апреля 2011

Вам нужно переопределить Equals и GetHashCode, чтобы использовать ваш объект в качестве ключа в словаре. Этот ответ дает отличное объяснение.

0 голосов
/ 01 апреля 2011

Прежде всего, я бы держался подальше от struct из-за бокса и различных ловушек кодирования, в которые он может нас упустить.*.GetHashCode, поскольку он используется в словарях, а Equals, поскольку он используется различными ORM и может быть полезен при реализации бизнес-логики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...