2013-02-14 90 views
2

下面的语句,如果源不是空工作正常。是否有任何可能的方法来编写我自己的扩展方法,如果源为空或者执行“选择”func(如果源不为null,则返回null)。如何扩展LINQ选择的方法我自己的方式

说,类似如下:

var s = Filters.Selection 
       .MyOwnSelect(o => new GetInputItem() { ItemID = o.ItemId }) 

“S”将是零,如果“Filters.Selection”为空,否则,“S”将包含评估“功能”使用LINQ选择。

这只是为了了解更多关于LINQ扩展/定制的信息。

谢谢。

+0

它可能会更有意义有's'是空的序列,而不是'null',因为这将让您链其他扩展方法关闭它安全。 – 2013-02-14 19:13:56

+0

非常感谢Reed – user203687 2013-02-18 22:11:55

回答

2

你可以这样做:

public static IEnumerable<U> SelectOrNull<T,U>(this IEnumerable<T> seq, Func<T,U> map) 
{ 
    if (seq == null) 
     return Enumerable.Empty<U>(); // Or return null, though this will play nicely with other operations 
    return seq.Select(map); 
} 
0

假设你正在谈论LINQ到对象,绝对:

public static class NullSafeLinq 
{ 
    public static IEnumerable<TResult> NullSafeSelect<TSource, TResult> 
     (this IEnumerable<TSource> source, Func<TSource, TResult> selector) 
    { 
     // We don't intend to be safe against null projections... 
     if (selector == null) 
     { 
      throw new ArgumentNullException("selector"); 
     } 
     return source == null ? null : source.Select(selector); 
    } 
} 

你也可以阅读我Edulinq blog post series更多地了解如何LINQ到对象的作品。

0

是看看框架中的Enumerable和Queryable类,它们实现了标准查询操作符。

您需要实现一个类似的类,它具有相同的匹配相同签名的Select扩展方法,那么如果源为null,请尽早退出,您应该返回一个空序列。