包含集合的记录的唯一性

问题描述 投票:0回答:1

我在 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);

如何使用记录强制嵌套集合的唯一性?

c#
1个回答
0
投票

您想要 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}";
}
© www.soinside.com 2019 - 2024. All rights reserved.