/// <summary> /// Extends a comparer such that null values are handled up-front by treating them /// as the largest possible value. /// </summary> /// <typeparam name="T">The type of the values being compared.</typeparam> /// <param name="baseComparer">The comparer to extend to handle nulls.</param> /// <returns>A new comparer that treats nulls as the largest possible value.</returns> /// <exception cref="System.ArgumentNullException">The base comparer is null.</exception> /// <remarks>The returned comparer is guaranteed to never pass a null value to the given base comparer.</remarks> public static IComparer <T> NullsLast <T>(this IComparer <T> baseComparer) { if (baseComparer == null) { throw new ArgumentNullException("baseComparer"); } IPrecedenceEnforcer <T> previous = baseComparer as IPrecedenceEnforcer <T>; if (previous != null) { return(previous.CreateUnkeyedComparer(nullsFirst: false)); } return(UnkeyedNullPlacementComparer <T> .GetComparer(baseComparer, nullsFirst : false)); }
public static IComparer <T> GetComparer(IComparer <T> baseComparer, IComparer <T> nextComparer) { // make sure null comparer stays highest precedence IPrecedenceEnforcer <T> nullComparer = baseComparer as IPrecedenceEnforcer <T>; if (nullComparer != null) { return(nullComparer.CreateCompoundComparer(nextComparer)); } CompoundComparer <T> comparer = new CompoundComparer <T>(); comparer.AppendComparison(baseComparer); comparer.AppendComparison(nextComparer); return(comparer.Normalize()); }
/// <summary> /// Extends a comparer such that null values are handled up-front by treating them /// as the largest possible value. /// </summary> /// <typeparam name="T">The type of the values being compared.</typeparam> /// <typeparam name="TKey">The type of the key returned by the selector.</typeparam> /// <param name="baseComparer">The comparer to extend to handle nulls.</param> /// <param name="keySelector">Returns the key that will be inspected for null values.</param> /// <returns>A new comparer that treats nulls as the largest possible value.</returns> /// <exception cref="System.ArgumentNullException">The base comparer is null.</exception> /// <exception cref="System.ArgumentNullException">The key selector is null.</exception> /// <remarks>The returned comparer is guaranteed to never pass a null value to the given base comparer.</remarks> public static IComparer <T> NullsLast <T, TKey>(this IComparer <T> baseComparer, Func <T, TKey> keySelector) { if (baseComparer == null) { throw new ArgumentNullException("baseComparer"); } if (keySelector == null) { throw new ArgumentNullException("keySelector"); } IPrecedenceEnforcer <T> previous = baseComparer as IPrecedenceEnforcer <T>; if (previous != null) { return(previous.CreateKeyedComparer(keySelector, nullsFirst: false)); } return(KeyedNullPlacementComparer <T, TKey> .GetComparer(baseComparer, keySelector, nullsFirst : false)); }