.NET 4.x Distinct для списка объектов класса - C#

Узнай цену своей работы

Формулировка задачи:

Ситуация такая: имеется класс
public class Item :
    {
        public string ID { get; set; }
 
        public string Parent { get; set; }
 
        public string Level { get; set; }
 
        public string LevelName { get; set; }
 
        public string Name { get; set; }
 
        public Item() {}
 
        public Item(XmlReader reader)
        {
            ID = reader["AOGUID"];
            Parent = reader["PARENTGUID"];
            Level = reader["AOLEVEL"];
            LevelName = reader["SHORTNAME"];
            Name = reader["OFFNAME"];
        }
    }
Имеется список объектов класса: List<Item> Требуется применить функцию Distinct к этому списку. на мсдн написано, что для этого надо унаследовать и реализовать интерфейс IEquatable<Item>. Условие равенства объектов: одинаковые ID или одинаковые Parent, Name, LevelName Как должны выглядеть реализации функций bool Equals(Item other) и int GetHashCode()? Вопрос вроде бы простой очень, но все же...
реализация методов:
        public bool Equals(Item other)
        {
            return ((this.GUID == other.GUID) || (this.Name == other.Name && this.LevelName == other.LevelName && this.Parent == other.Parent));
        }
 
        public override int GetHashCode()
        {
            var id = this.GUID== null ? 0 : this.GUID.GetHashCode();
            var name = this.Name== null ? 0 : this.Name.GetHashCode();
            var levelName = this.LevelName== null ? 0 : this.LevelName.GetHashCode();
            var parent = this.Parent== null ? 0: this.Parent.GetHashCode();
            var level = this.Level == null ? 0 : this.Level.GetHashCode();
            return id ^ name ^ levelName ^ parent ^ level;
        }
тестовый код:
var items = new List<Item>();
            items.Add(new Item {GUID = "1", Level = "1", LevelName = "level1", Name = "Name", Parent = "1"});
            items.Add(new Item {GUID = "2", Level = "1", LevelName = "level1", Name = "Name", Parent = "1"});
            Console.WriteLine(items.Count);
            var result = items.Distinct();
            Console.WriteLine(result.Count());
            Console.ReadLine();
в итоге пишет что все так же 2 объекта в списке и, что любопытно, не идет вызов функции Equals

Решение задачи: «.NET 4.x Distinct для списка объектов класса»

textual
Листинг программы
        int hash = 17;
        hash = hash * 31 + field1.GetHashCode();
        hash = hash * 31 + field2.GetHashCode();
        hash = hash * 31 + field3.GetHashCode();
        ...
        return hash;

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.286 из 5