.NET 4.x Distinct для списка объектов класса - C#
Формулировка задачи:
Ситуация такая: имеется класс
Имеется список объектов класса: List<Item>
Требуется применить функцию Distinct к этому списку. на мсдн написано, что для этого надо унаследовать и реализовать интерфейс IEquatable<Item>.
Условие равенства объектов: одинаковые ID или одинаковые Parent, Name, LevelName
Как должны выглядеть реализации функций bool Equals(Item other) и int GetHashCode()?
Вопрос вроде бы простой очень, но все же...
тестовый код:
в итоге пишет что все так же 2 объекта в списке и, что любопытно, не идет вызов функции Equals
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"]; } }
реализация методов:
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();
Решение задачи: «.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;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д