Переопределите реализации по умолчанию Equals()
и GetHashCode()
(например, другие, упомянутые в комментариях), чтобы HashSet<>
или Distinct()
работали. Вы также можете реализовать IEquatable<>
, что потребует от вас переопределения методов Equals()
и GetHashCode()
.
public class Error : IEquatable<Error>
{
public string File { set; get; }
public int Block { set; get; }
public bool Equals(Error other)
{
// Check whether the compared object is null.
if (Object.ReferenceEquals(other, null)) return false;
// Check whether the compared object references the same data.
if (Object.ReferenceEquals(this, other)) return true;
// Check whether the error's properties are equal.
return File == other.File && Block == other.Block;
}
// If Equals() returns true for a pair of objects
// then GetHashCode() must return the same value for these objects.
public override int GetHashCode()
{
return $"{Block}-{File}".GetHashCode(); // adjust this as you see fit
}
}
Ссылка: https://docs.microsoft.com/en-us/dotnet/api/system.linq.enumerable.distinct?view=netcore-3.1
Не забудьте обработать значения null
в строке File
. (Можно заменить его, например, на String.Empty
.) Также обычно "кэшируют" хэш-код в частной переменной, так что после вычисления кэшированное значение может быть возвращено при последующих вызовах GetHashCode()
. Для этого вам, скорее всего, также потребуется сделать класс неизменяемым.
(Вам не придется делать ничего из этого с типами записей C# 9.)