我在 HashSet 中使用 C#
record
来强制唯一性。这很有效,但是一旦记录包含集合,它就会停止工作。
即。这过去了:
public record Person
{
public string FirstName { get; set; }
}
HashSet<Person> uniquePeople = new();
uniquePeople.Add(new Person { FirstName = "John" });
uniquePeople.Add(new Person { FirstName = "John" });
Assert.That(uniquePeople.Count() == 1);
但这失败了:
public record Person
{
public string FirstName { get; set; }
public HashSet<int> FavouriteNumbers { get; set; } = new();
}
HashSet<Person> uniquePeople = new();
uniquePeople.Add(new Person { FirstName = "John" });
uniquePeople.Add(new Person { FirstName = "John" });
Assert.That(uniquePeople.Count() == 1);
如何使用记录强制嵌套集合的唯一性?
您想要 custom
Equals
和 GetHashCode
,这就是为什么我建议将 record
(它有自己的这些方法的实现)变成 class
:
public class Person {
public string FirstName { get; set; }
public HashSet<int> FavouriteNumbers { get; set; } = new();
public override int GetHashCode() =>
HashCode.Combine(FirstName, FavouriteNumbers.Count);
public override bool Equals(object? obj) => obj is Person person &&
string.Equals(FirstName, person.FirstName) &&
FavouriteNumbers.SetEquals(person.FavouriteNumbers);
public override string ToString() => $"{FirstName}";
}