Сравнение элементов массива

SAUtrade

Здравствуйте!
List<Step> listMove = new List<Step>();
                GetListOfLegalMove(side, listMove);
                step = new Step(new Pair(mSelectedCellX, mSelectedCellY), new Pair(x, y));
 
                foreach (Step item in listMove)
                {
                    if (step == item) return;
 
                    if ((step.FirstPair.First == item.FirstPair.First)&&(step.FirstPair.Second == item.FirstPair.Second)&&
                        (step.SecondPair.First == item.SecondPair.First)&&(step.SecondPair.Second == item.SecondPair.Second))
{
....
}
//Такая запись
if (step == item) // false
 
// по идее должна соответсвовать 
if ((step.FirstPair.First == item.FirstPair.First)&&(step.FirstPair.Second == item.FirstPair.Second)&&
                        (step.SecondPair.First == item.SecondPair.First)&&(step.SecondPair.Second == item.SecondPair.Second)) // true
Почему так происходит?
7 ответов

SAUtrade

SAUtrade, если Step это класс, то не должна.


SAUtrade

Класс... А можно ли как то упростить данную запись?
if ((step.FirstPair.First == item.FirstPair.First)&&(step.FirstPair.Second == item.FirstPair.Second)&&
(step.SecondPair.First == item.SecondPair.First)&&(step.SecondPair.Second == item.SecondPair.Second))
или лучше перегрузить operator ==?


SAUtrade

SAUtrade, лучше перегрузи.Скинь код Step, я покажу, как перегрузить надо


SAUtrade

 public class Step
    {
        public Pair FirstPair { get; set; }
        public Pair SecondPair { get; set; }
 
        public Step(Pair first, Pair second)
        {
            FirstPair = first;
            SecondPair = second;
        }
    }
    public class Pair
    {
        public int First { get; set; }
        public int Second { get; set; }
 
        public Pair(int x, int y)
        {
            First = x;
            Second = y;
        }
    }


SAUtrade

 public class Pair : IEquatable<Pair>
    {
        public int First { get; set; }
        public int Second { get; set; }
 
        public Pair(int x, int y)
        {
            First = x;
            Second = y;
        }
 
        #region equality
 
        public bool Equals(Pair other)
        {
            if (ReferenceEquals(null, other))
                return false;
            if (ReferenceEquals(this, other))
                return true;
            return First == other.First && Second == other.Second;
        }
 
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj))
                return false;
            if (ReferenceEquals(this, obj))
                return true;
            if (obj.GetType() != this.GetType())
                return false;
            return Equals((Pair) obj);
        }
 
        public override int GetHashCode()
        {
            unchecked
            {
                return (First*397) ^ Second;
            }
        }
 
        public static bool operator ==(Pair left, Pair right)
        {
            return Equals(left, right);
        }
 
        public static bool operator !=(Pair left, Pair right)
        {
            return !Equals(left, right);
        }
 
        #endregion
    }
    public class Step : IEquatable<Step>
    {
        public Pair FirstPair { get; set; }
        public Pair SecondPair { get; set; }
 
        public Step(Pair first, Pair second)
        {
            FirstPair = first;
            SecondPair = second;
        }
 
        #region equality
 
        public bool Equals(Step other)
        {
            if (ReferenceEquals(null, other))
                return false;
            if (ReferenceEquals(this, other))
                return true;
            return Equals(FirstPair, other.FirstPair) && Equals(SecondPair, other.SecondPair);
        }
 
        public override bool Equals(object obj)
        {
            if (ReferenceEquals(null, obj))
                return false;
            if (ReferenceEquals(this, obj))
                return true;
            if (obj.GetType() != this.GetType())
                return false;
            return Equals((Step) obj);
        }
 
        public override int GetHashCode()
        {
            unchecked
            {
                return ((FirstPair != null ? FirstPair.GetHashCode() : 0)*397)
                       ^ (SecondPair != null ? SecondPair.GetHashCode() : 0);
            }
        }
 
        public static bool operator ==(Step left, Step right)
        {
            return Equals(left, right);
        }
 
        public static bool operator !=(Step left, Step right)
        {
            return !Equals(left, right);
        }
 
        #endregion
 
    }


SAUtrade

Вопрос 397??? это что?