예제 #1
0
        /// <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));
        }
예제 #2
0
        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());
        }
예제 #3
0
        /// <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));
        }