using System.Collections.Generic;
using System.Collections.Immutable;
public record Person(string FirstName, ImmutableHashSet<int> FavouriteNumbers)
public Person(string FirstName, IEnumerable<int> FavouriteNumbers) : this(FirstName, ImmutableHashSet.CreateRange(FavouriteNumbers)) { }
public override int GetHashCode() => HashCode.Combine(FirstName, FavouriteNumbers?.Count);
public virtual bool Equals(Person? other) =>
object.ReferenceEquals(other, this)
|| (!object.ReferenceEquals(other, null) && this.GetType() == other.GetType() && this.FirstName == other.FirstName && this.FavouriteNumbers.SetEquals(other.FavouriteNumbers));
protected virtual bool PrintMembers(StringBuilder sb)
sb.Append(nameof(FirstName)).Append(" = ").Append(FirstName)
.Append(nameof(FavouriteNumbers)).Append(" = ").AppendJoin(',', FavouriteNumbers);
public static void Main()
var person = new Person("Foo", new [] { 1, 2, 3 });
var p2 = new Person("Foo", ImmutableHashSet.Create(new [] { 3, 2, 1 }));
Console.WriteLine($"{person} == {p2} = {eq}");
var p3= new Person("Foo", new [] { 1, 2, 4 });
Console.WriteLine($"{person} == {p3} = {eq3}");
var modifiedPerson = person with {
FavouriteNumbers = person.FavouriteNumbers.Remove(3).Add(5)
Console.WriteLine($"\nmodifiedPerson = {modifiedPerson}");
Assert.That( person != modifiedPerson);
var newName = person with { FirstName = "Bar" };
Assert.That( person != newName);