Cравнение List<T> на равенство данных

Рейтинг: 1Ответов: 1Опубликовано: 28.07.2023

Мне нужно сравнивать два List<Car> на равенство данных.

Погуглил и нашёл вроде как подходящий метод SequenceEqual

Вроде всё сделал как на MSDN

Но если в классе Car, присутствует объект Radio, то сравнение проходит неудачно.

Мои классы:

    public class Car : IEquatable<Car>
    {
        public string? Model { get; set; }
        public bool Dead { get; set; }
        public int MaxSpeed { get; set; }
        public Radio? Music { get; set; }

        public bool Equals(Car? other)
        {
            if (other == null)
                return false;

            return Model == other.Model &&
                    Dead == other.Dead &&
                    MaxSpeed == other.MaxSpeed &&
                    Music == other.Music;

        }

        public override bool Equals(object? obj) => Equals(obj as Car);
        public override int GetHashCode() => (Model, Dead, MaxSpeed, Music).GetHashCode();
    }

    public class Radio : IEquatable<Radio>
    {
        public int Volume { get; set; }

        public bool Equals(Radio? other)
        {
            if (other == null) 
            {
                return false;
            }

            return Volume == other.Volume;
        }

        public override bool Equals(object? obj) => Equals(obj as Radio);
        public override int GetHashCode() => (Volume).GetHashCode();
    }

Не проходит тест

[TestMethod]
public void CarTest_Equal_True()
{
    // Arrange
    List<Car> cars1 = new()
    {
        new Car()
        {
            Dead = false,
            MaxSpeed = 100,
            Model = "Tesla",
            Music = new Radio()
            {
                Volume = 100
            }
        }
    };

    List<Car> cars2 = new()
    {
        new Car()
        {
            Dead = false,
            MaxSpeed = 100,
            Model = "Tesla",
            Music = new Radio()
            {
                Volume = 100
            }
        }
    };

    // Act
    bool equal = cars1.SequenceEqual(cars2);

    // Assert
    Assert.AreEqual(true, equal);
}

Проходит тест

[TestMethod]
public void CarTest_MusicNull_Equal_True()
{
    // Arrange
    List<Car> cars1 = new()
    {
        new Car()
        {
            Dead = false,
            MaxSpeed = 100,
            Model = "Tesla"
        }
    };

    List<Car> cars2 = new()
    {
        new Car()
        {
            Dead = false,
            MaxSpeed = 100,
            Model = "Tesla"
        }
    };

    // Act
    bool equal = cars1.SequenceEqual(cars2);

    // Assert
    Assert.AreEqual(true, equal);
}

Скрин с MSDN введите сюда описание изображения

Ответы

▲ 2Принят

Ошибка кроется здесь:

Music == other.Music;

Нужно написать:

Music?.Equals(other.Music);

В оригинале сравниваются объекты, а они разные, хоть их содержимое и одинаково. А замена сравнивает объекты по их содержимому.