using System; using System.Collections.Generic; namespace ScreenConnect; public static class KeyComparer { private class CustomKeyEqualityComparer(Func keyExtractor, IEqualityComparer keyEqualityComparer) : IEqualityComparer where TKey : notnull { public bool Equals(T? x, T? y) { return keyEqualityComparer.Equals(keyExtractor(x), keyExtractor(y)); } public int GetHashCode(T obj) { return keyExtractor(obj).GetHashCode(); } } private class EquatableKeyEqualityComparer(Func keyExtractor) : IEqualityComparer where TKey : IEquatable { public bool Equals(T? x, T? y) { return keyExtractor(x).Equals(keyExtractor(y)); } public int GetHashCode(T obj) { return keyExtractor(obj).GetHashCode(); } } private class CustomKeyComparer(Func keyExtractor, IComparer keyComparer) : IComparer where TKey : notnull { public int Compare(T? x, T? y) { return keyComparer.Compare(keyExtractor(x), keyExtractor(y)); } } private class ComparableKeyComparer(Func keyExtractor) : IComparer where TKey : IComparable { public int Compare(T? x, T? y) { return keyExtractor(x).CompareTo(keyExtractor(y)); } } public static IEqualityComparer CreateEqualityComparer(Func keyExtractor) where TKey : IEquatable { return new EquatableKeyEqualityComparer(keyExtractor); } public static IEqualityComparer CreateEqualityComparer(Func keyExtractor, IEqualityComparer keyEqualityComparer) where TKey : notnull { return new CustomKeyEqualityComparer(keyExtractor, keyEqualityComparer); } public static IComparer CreateComparer(Func keyExtractor) where TKey : IComparable { return new ComparableKeyComparer(keyExtractor); } public static IComparer CreateComparer(Func keyExtractor, IComparer keyComparer) where TKey : notnull { return new CustomKeyComparer(keyExtractor, keyComparer); } }