.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;