我并没有真正回答你的问题,但这里是重载:
public static bool SequenceEqual<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second,
Func<TSource, TSource, bool> predicate)
{
return first.SequenceEqual(second, new PredicateEqualityComparer<TSource>(predicate));
}
public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer, IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector, Func<TOuter, TInner, TResult> resultSelector, Func<TKey, TKey, bool> predicate)
{
return outer.Join(inner, outerKeySelector, innerKeySelector, resultSelector, new PredicateEqualityComparer<TKey>(predicate));
}
public static IEnumerable<TResult> GroupJoin<TOuter, TInner, TKey, TResult>(this IEnumerable<TOuter> outer,
IEnumerable<TInner> inner, Func<TOuter, TKey> outerKeySelector, Func<TInner, TKey> innerKeySelector,
Func<TOuter, IEnumerable<TInner>, TResult> resultSelector, Func<TKey, TKey, bool> predicate)
{
return outer.GroupJoin(inner, outerKeySelector, innerKeySelector, resultSelector,
new PredicateEqualityComparer<TKey>(predicate));
}
public static IEnumerable<IGrouping<TKey, TSource>> GroupBy<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TKey, TKey, bool> predicate)
{
return source.GroupBy(keySelector, new PredicateEqualityComparer<TKey>(predicate));
}
public static IEnumerable<IGrouping<TKey, TElement>> GroupBy<TSource, TKey, TElement>(
this IEnumerable<TSource> source, Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, TKey, bool> predicate)
{
return source.GroupBy(keySelector, elementSelector, new PredicateEqualityComparer<TKey>(predicate));
}
public static IEnumerable<TResult> GroupBy<TSource, TKey, TResult>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TKey, IEnumerable<TSource>, TResult> resultSelector,
Func<TKey, TKey, bool> predicate)
{
return source.GroupBy(keySelector, resultSelector, new PredicateEqualityComparer<TKey>(predicate));
}
public static IEnumerable<TResult> GroupBy<TSource, TKey, TElement, TResult>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector,
Func<TKey, IEnumerable<TElement>, TResult> resultSelector, Func<TKey, TKey, bool> predicate)
{
return source.GroupBy(keySelector, elementSelector, resultSelector, new PredicateEqualityComparer<TKey>(predicate));
}
public static IEnumerable<TSource> Distinct<TSource>(this IEnumerable<TSource> source,
Func<TSource, TSource, bool> predicate)
{
return source.Distinct(new PredicateEqualityComparer<TSource>(predicate));
}
public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TSource, bool> predicate)
{
return first.Union(second, new PredicateEqualityComparer<TSource>(predicate));
}
public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first,
IEnumerable<TSource> second, Func<TSource, TSource, bool> predicate)
{
return first.Intersect(second, new PredicateEqualityComparer<TSource>(predicate));
}
public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second,
Func<TSource, TSource, bool> predicate)
{
return first.Except(second, new PredicateEqualityComparer<TSource>(predicate));
}
public static Dictionary<TKey, TSource> ToDictionary<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TKey, TKey, bool> predicate)
{
return source.ToDictionary(keySelector, new PredicateEqualityComparer<TKey>(predicate));
}
public static Dictionary<TKey, TElement> ToDictionary<TSource, TKey, TElement>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TSource, TElement> elementSelector, Func<TKey, TKey, bool> predicate)
{
return source.ToDictionary(keySelector, elementSelector, new PredicateEqualityComparer<TKey>(predicate));
}
public static ILookup<TKey, TSource> ToLookup<TSource, TKey>(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, Func<TKey, TKey, bool> predicate)
{
return source.ToLookup(keySelector, new PredicateEqualityComparer<TKey>(predicate));
}
public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value,
Func<TSource, TSource, bool> predicate)
{
return source.Contains(value, new PredicateEqualityComparer<TSource>(predicate));
}
通过以下方式实现:
public class PredicateEqualityComparer<T> : IEqualityComparer<T>
{
private Func<T, T, bool> _predicate;
public PredicateEqualityComparer(Func<T, T, bool> predicate)
{
_predicate = predicate;
}
public bool Equals(T a, T b)
{
return _predicate(a, b);
}
public int GetHashCode(T a)
{
return a.GetHashCode();
}
}
我只测试了 SequenceEqual。由于散列,其中一些重载可能无法按预期工作。这取决于你,想清楚。