diff --git a/ICD.Common.Utils/Comparers/PredicateComparer.cs b/ICD.Common.Utils/Comparers/PredicateComparer.cs new file mode 100644 index 0000000..03429f3 --- /dev/null +++ b/ICD.Common.Utils/Comparers/PredicateComparer.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace ICD.Common.Utils.Comparers +{ + public sealed class PredicateComparer : IComparer + { + private readonly IComparer m_Comparer; + private readonly Func m_Predicate; + + /// + /// Constructor. + /// + /// + public PredicateComparer(Func predicate) + : this(Comparer.Default, predicate) + { + } + + /// + /// Constructor. + /// + /// + /// + public PredicateComparer(IComparer comparer, Func predicate) + { + m_Comparer = comparer; + m_Predicate = predicate; + } + + public int Compare(TParent x, TParent y) + { + TValue a = m_Predicate(x); + TValue b = m_Predicate(y); + + return m_Comparer.Compare(a, b); + } + } +} diff --git a/ICD.Common.Utils/Comparers/PredicateEqualityComparer.cs b/ICD.Common.Utils/Comparers/PredicateEqualityComparer.cs new file mode 100644 index 0000000..24b58a1 --- /dev/null +++ b/ICD.Common.Utils/Comparers/PredicateEqualityComparer.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; + +namespace ICD.Common.Utils.Comparers +{ + public sealed class PredicateEqualityComparer : IEqualityComparer + { + private readonly IEqualityComparer m_Comparer; + private readonly Func m_Predicate; + + /// + /// Constructor. + /// + /// + public PredicateEqualityComparer(Func predicate) + : this(EqualityComparer.Default, predicate) + { + } + + /// + /// Constructor. + /// + /// + /// + public PredicateEqualityComparer(IEqualityComparer comparer, Func predicate) + { + m_Comparer = comparer; + m_Predicate = predicate; + } + + public bool Equals(TParent x, TParent y) + { + TValue a = m_Predicate(x); + TValue b = m_Predicate(y); + + return m_Comparer.Equals(a, b); + } + + public int GetHashCode(TParent parent) + { + TValue value = m_Predicate(parent); + return m_Comparer.GetHashCode(value); + } + } +} diff --git a/ICD.Common.Utils/Comparers/PropertyComparer.cs b/ICD.Common.Utils/Comparers/PropertyComparer.cs deleted file mode 100644 index 1e75327..0000000 --- a/ICD.Common.Utils/Comparers/PropertyComparer.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace ICD.Common.Utils.Comparers -{ - public sealed class PropertyComparer : IComparer - { - private readonly IComparer m_Comparer; - private readonly Func m_GetProperty; - - /// - /// Constructor. - /// - /// - /// - public PropertyComparer(IComparer comparer, Func getProperty) - { - m_Comparer = comparer; - m_GetProperty = getProperty; - } - - public int Compare(TParent x, TParent y) - { - TProperty a = m_GetProperty(x); - TProperty b = m_GetProperty(y); - - return m_Comparer.Compare(a, b); - } - } -} diff --git a/ICD.Common.Utils/Comparers/PropertyEqualityComparer.cs b/ICD.Common.Utils/Comparers/PropertyEqualityComparer.cs deleted file mode 100644 index b425a22..0000000 --- a/ICD.Common.Utils/Comparers/PropertyEqualityComparer.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace ICD.Common.Utils.Comparers -{ - /// - /// Allows for comparing items based on some property. - /// - /// - /// - public sealed class PropertyEqualityComparer : IEqualityComparer - { - private readonly IEqualityComparer m_Comparer; - private readonly Func m_GetProperty; - - /// - /// Constructor. - /// - /// - /// - public PropertyEqualityComparer(IEqualityComparer comparer, Func getProperty) - { - m_Comparer = comparer; - m_GetProperty = getProperty; - } - - public bool Equals(TParent x, TParent y) - { - TProperty a = m_GetProperty(x); - TProperty b = m_GetProperty(y); - - return m_Comparer.Equals(a, b); - } - - public int GetHashCode(TParent parent) - { - TProperty property = m_GetProperty(parent); - return m_Comparer.GetHashCode(property); - } - } -} diff --git a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs index d397a0f..2735f04 100644 --- a/ICD.Common.Utils/Extensions/EnumerableExtensions.cs +++ b/ICD.Common.Utils/Extensions/EnumerableExtensions.cs @@ -694,7 +694,7 @@ namespace ICD.Common.Utils.Extensions if (propertyComparer == null) throw new ArgumentNullException("propertyComparer"); - return extends.Distinct(new PropertyEqualityComparer(propertyComparer, getProperty)); + return extends.Distinct(new PredicateEqualityComparer(propertyComparer, getProperty)); } /// diff --git a/ICD.Common.Utils/ICD.Common.Utils_SimplSharp.csproj b/ICD.Common.Utils/ICD.Common.Utils_SimplSharp.csproj index 77241a9..52ac708 100644 --- a/ICD.Common.Utils/ICD.Common.Utils_SimplSharp.csproj +++ b/ICD.Common.Utils/ICD.Common.Utils_SimplSharp.csproj @@ -74,7 +74,7 @@ - + @@ -88,7 +88,7 @@ - +