Skip to content

Instantly share code, notes, and snippets.

@Sl4vP0weR
Last active March 24, 2024 04:22
Show Gist options
  • Save Sl4vP0weR/57218b302d70d22effb57777877c6526 to your computer and use it in GitHub Desktop.
Save Sl4vP0weR/57218b302d70d22effb57777877c6526 to your computer and use it in GitHub Desktop.
public sealed class SequenceEqualityComparer<T> : IEqualityComparer<IEnumerable<T>>
{
public readonly IEqualityComparer<T> Comparer;
public SequenceEqualityComparer(IEqualityComparer<T>? comparer = null)
{
Comparer = comparer ?? EqualityComparer<T>.Default;
}
public static readonly SequenceEqualityComparer<T> Instance = new();
public bool Equals(IEnumerable<T>? x, IEnumerable<T>? y)
{
var xIsNull = x is null;
var yIsNull = y is null;
if (xIsNull && yIsNull)
return true;
if (xIsNull || yIsNull)
return false;
using var xEnumerator = x.GetEnumerator();
using var yEnumerator = y.GetEnumerator();
while (true)
{
var xNext = xEnumerator.MoveNext();
var yNext = yEnumerator.MoveNext();
if(!xNext && !yNext)
break;
if (xNext != yNext)
return false;
if (!Comparer.Equals(xEnumerator.Current, yEnumerator.Current))
return false;
}
return true;
}
public int GetHashCode(IEnumerable<T> sequence)
{
var hash = new HashCode();
foreach (var element in sequence)
hash.Add(element);
return hash.ToHashCode();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment