using System.Diagnostics.CodeAnalysis; using JNPF.DependencyInjection; namespace JNPF.Common.Security; /// /// 相等比较辅助类,用于快速创建的实例. /// /// /// var equalityComparer1 = EqualityHelper[Person].CreateComparer(p => p.ID); /// var equalityComparer2 = EqualityHelper[Person].CreateComparer(p => p.Name); /// var equalityComparer3 = EqualityHelper[Person].CreateComparer(p => p.Birthday.Year). /// /// 要比较的类型. [SuppressSniffer] public static class EqualityHelper { /// /// 创建指定对比委托的实例. /// public static IEqualityComparer CreateComparer(Func keySelector) { return new CommonEqualityComparer(keySelector); } /// /// 创建指定对比委托与结果二次比较器的实例. /// public static IEqualityComparer CreateComparer(Func keySelector, IEqualityComparer comparer) { return new CommonEqualityComparer(keySelector, comparer); } /// /// 共同平等比较器. /// /// 要比较的类型. private class CommonEqualityComparer : IEqualityComparer { private readonly IEqualityComparer _comparer; private readonly Func _keySelector; public CommonEqualityComparer(Func keySelector, IEqualityComparer comparer) { _keySelector = keySelector; _comparer = comparer; } public CommonEqualityComparer(Func keySelector) : this(keySelector, EqualityComparer.Default) { } public bool Equals(T? x, T? y) { return _comparer.Equals(_keySelector(x), _keySelector(y)); } public int GetHashCode([DisallowNull] T obj) { return _comparer.GetHashCode(_keySelector(obj)!); } } }