public static bool NullableDictionaryEqual <TKey, TValue>(this IDictionary <TKey, TValue> first, IDictionary <TKey, TValue> second)
        {
            if (first == null && second == null)
            {
                return(true);
            }
            else if (first == null || second == null)
            {
                return(false);
            }
            else if (object.ReferenceEquals(first, second))
            {
                return(true);
            }

            var keyComparer = BaseEqualityComparer <KeyValuePair <TKey, TValue> > .Make((_1, _2) => object.Equals(_1.Key, _2.Key), _ => _.Key.NullableGetHashCode());

            return(first.Count == second.Count && !first.Except(second, keyComparer).Any());
        }
 public static bool NullableSequenceEqual <TSource>(this IEnumerable <TSource> first, IEnumerable <TSource> second)
 {
     return(NullableSequenceEqual(first, second, BaseEqualityComparer <TSource> .Make()));
 }