2016-09-21 1 views
0

Я пытаюсь выяснить, как создать метод Equals, который сравнивает содержимое двух очередей. Вот мой код:Метод Bool Equals всегда возвращает false при сравнении очередей с идентичным содержимым

public OurQueue(int capacity = 10) 
    { 
     myArray = new T[capacity]; 
    } 

private void Increment(ref int value) 
    { 
     if (++value == myArray.Length) 
      value = 0; 
    } 


public bool Equals(T item) 
    {   
     OurQueue<T> Q1 = new OurQueue<T>(); 
     OurQueue<T> Q2 = new OurQueue<T>(); 
     bool itemEqual = false; 

     if (IsEmpty() == true) 
      throw new ApplicationException("Can't compare empty queues"); 

     while (Q1.Count() != 0 && Q2.Count() != 0) 
     { 
       if (Q1.myArray[mFront].Equals(Q2.myArray[mFront])) 
       { 
        itemEqual = true; 
        Q1.Increment(ref mFront); 
        Q2.Increment(ref mFront); 
       } 
       else 
        return itemEqual = false;  
     } 
     return itemEqual; 
    } 

Любые мысли о том, где я неправильно?

EDITED: добавлен метод OurQueue и Increment в соответствии с запросом.

+2

Приращение добавит один к mFront? в то время как вы дважды вызывали функцию в цикле – Matt

+0

Вам нужно опубликовать класс 'OurQueue' или, по крайней мере, описать реализацию' OurQueue.Increment'. –

+0

Для ссылочных типов методы Equals возвращают true, если ссылки одинаковы - значения объекта не проверяются. Итак, вы хотите сравнить ссылки или фактические значения в ваших очередях. Хотя я несколько смущен вашим кодом (например, откуда берутся две очереди), не возвратит ли он значение последнего сравнения в двух очередях. Если две очереди пустые, результат не будет равен true - вы по умолчанию равны false. – PaulF

ответ

1

Во-первых, вы должны обновить параметры метода, чтобы он фактически принимал 2 объекта очереди.

Во-вторых, проверьте, не совпадают ли их значения, и верните false, если они есть. Я предполагаю, что если вы сравниваете две пустые очереди, у вас будет случай исключения (или верните true - это зависит от вас).

В-третьих, создайте 2 новые очереди на основе тех, которые вы получили в качестве входных данных. В основном цикле while, поскольку вы знаете, что оба Очереди должны быть одного размера, вы можете Pop() и сравнивать каждое значение из новых очередей. Если они не равны, просто return false; в отличие от возврата некоторого сохраненного bool.