Rather than having the class implement the comparison, use external classes implementing
IComparer<IPerson>
.
public abstract class PersonComparer : IComparer<IPerson>
{
public int Compare(IPerson left, IPerson right)
{
if (left is null) return right is null ? 0 : -1;
if (right is null) return 1;
return CompareCore(left, right);
}
protected abstract int CompareCore(IPerson left, IPerson right);
}
public class PersonNameComparer : PersonComparer
{
protected override int CompareCore(IPerson left, IPerson right) => StringComparer.CurrentCulture.Compare(left.Name, right.Name);
}
public class PersonAgeComparer : PersonComparer
{
protected override int CompareCore(IPerson left, IPerson right) => left.Age.CompareTo(right.Age);
}
public class PersonCompanyComparer : PersonComparer
{
protected override int CompareCore(IPerson left, IPerson right) => StringComparer.CurrentCulture.Compare(left.Company, right.Company);
}
IComparer<T> Interface (System.Collections.Generic) | Microsoft Learn[
^]