C # проблема очереди - PullRequest
       23

C # проблема очереди

3 голосов
/ 21 сентября 2009

Предположим, у меня есть класс

XYNode
{
    protected int mX;
    protected int mY;
}

и очередь

Queue<XyNode> testQueue = new Queue<XYNode>();

Я хочу проверить, находится ли узел с этой конкретной координатой x и y уже в очереди. Очевидно, что следующее не работает:

testQueue.Contains(new XYNode(testX, testY))

потому что даже если узел с этими координатами находится в очереди, мы проверяем другой объект XYNode, поэтому он всегда будет возвращать false.

Какое решение?

Ответы [ 3 ]

17 голосов
/ 21 сентября 2009

Самый простой способ - переопределить Equals, чтобы один XYNode знал, равен ли он другому XYNode. Вы должны переопределить GetHashCode() в то же время и, возможно, также реализовать IEquatable<XYNode>, чтобы позволить строго типизированное сравнение на равенство.

В качестве альтернативы, вы можете написать реализацию IEqualityComparer<XYNode>, чтобы сравнить любые два узла и вернуть, являются ли они одинаковыми или нет, а затем передать это в вызов соответствующей перегрузки метода расширения Contains определено в Enumerable (при условии, что вы используете .NET 3.5).

Дополнительные вопросы для рассмотрения:

  • Не могли бы вы использовать закрытые поля вместо защищенных?
  • Может ли ваш класс быть опечатан?
  • Может ли ваш класс быть неизменным?
  • Должен ли ваш класс быть структурой? (Судебный звонок ...)
  • Если вы перегружаете операторы == и! =?
5 голосов
/ 21 сентября 2009

Для иллюстрации ... оригинального ... ответа Джона Скита:

class XYNode {
    protected int mX;
    protected int mY;

    public override bool Equals(Object obj) {
        if (obj == null || this.GetType() != obj.GetType()) { return false; }

        XYNode otherNode = (XYNode)obj;
        return (this.mX == other.mX) && (this.mY == other.mY);
    }
}

Это довольно упрощенное решение. Есть много дополнительных факторов, которые Джон должен упомянуть.

0 голосов
/ 03 марта 2012

Вы можете просто выполнить итерацию с foreach и проверить X и Y вашего XYNode на каждом элементе.

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