0
我有一个小的工具扩展方法,对IEnumerable<T>
中的一些LINQ扩展方法执行一些空的检查。该代码看起来像这样我可以得到扩展方法的Func对象
public static class MyIEnumerableExtensions
{
// Generic wrapper to allow graceful handling of null values
public static IEnumerable<T> NullableExtension<T>(this IEnumerable<T> first, IEnumerable<T> second, Func<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> f)
{
if (first == null && second == null) return Enumerable.Empty<T>();
if (first == null) return second;
if (second == null) return first;
return f(first, second);
}
// Wrap the Intersect extension method in our Nullable wrapper
public static IEnumerable<T> NullableIntersect<T>(this IEnumerable<T> first, IEnumerable<T> second)
{
// It'd be nice to write this as
//
// return first.NullableExtension<T>(second, IEnumerable<T>.Intersect);
//
return first.NullableExtension<T>(second, (a,b) => a.Intersect(b));
}
}
那么,有没有办法在IEnumerable<T>.Intersect
扩展方法NullableExtension
传递,而不是直接在一个lambda包装呢?
编辑
因为它实际上是简洁在Enumerable
扩展方法来传递,我除去NullableIntersect
(和其他)的方法和只直接调用可为空的包装。另外,正如安东尼指出的那样,根据扩展方法,空值枚举应该做什么的语义是不同的,即Union
与Intersect
。因此,我将NullableExtension
方法重命名为IgnoreIfNull
,它更好地反映了通用行为。
public static class MyIEnumerableExtensions
{
// Generic wrappers to allow graceful handling of null values
public static IEnumerable<T> IgnoreIfNull<T>(this IEnumerable<T> first, IEnumerable<T> second, Func<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> f)
{
if (first == null && second == null) return Enumerable.Empty<T>();
if (first == null) return second;
if (second == null) return first;
return f(first, second);
}
public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> first, IEnumerable<T> second, Func<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> f)
{
return f(first ?? Enumerable.Empty<T>(), second ?? Enumerable.Empty<T>());
}
}
// Usage example. Returns { 1, 4 } because arguments to Union and Intersect are ignored
var items = new List<int> { 1, 4 };
var output1 = items.IgnoreIfNull(null, Enumerable.Union).IgnoreIfNull(null, Enumerable.Intersect);
// Usage example. Returns { } because arguments to Union and Intersect are set to empty
var output2 = items.EmptyIfNull(null, Enumerable.Union).EmptyIfNull(null, Enumerable.Intersect);
我自己跟踪了这一点。为了速度而+1。 – Lucas
@卢卡斯,我刚刚添加了一个问题,一定要检查修订版,看它是否是一个绊脚石。 –
是的,我注意到了这一点,并在我的项目中将扩展方法重命名为'IgnoreIfNull',以更好地反映语义,即'var output = first.IgnoreIfNull(second,Enumerable.Intersect)' – Lucas