如何以我自己的方式扩展LINQ select方法

时间:2013-02-14 19:06:01

标签: linq

如果源不为null,则以下语句可以正常工作:

Filters.Selection
            .Select(o => new GetInputItem() { ItemID = o.ItemId })

如果“Filters.Selection”为空(显然),则会发生炸弹。是否有任何可能的方法来编写我自己的扩展方法,如果源为null,则返回null,或者如果源不为null,则执行“Select”func。

说,如下所示:

var s = Filters.Selection
                .MyOwnSelect(o => new GetInputItem() { ItemID = o.ItemId })
如果“Filters.Selection”为空,则

“s”将为null,否则,“s”将包含使用LINQ Select的已评估“func”。

这只是为了了解有关LINQ扩展/自定义的更多信息。

感谢。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

假设您正在谈论LINQ to Objects,绝对是:

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 to Objects的工作原理的更多信息。

答案 2 :(得分:0)

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

您需要使用与相同签名匹配的相同Select扩展方法来实现类似的类,然后如果源提前为null,则应返回空序列。