2

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

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

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

说,类似于以下内容:

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

如果“Filters.Selection”为空,“s”将为空,否则,“s”将包含使用 LINQ Select 评估的“func”。

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

谢谢。

4

3 回答 3

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);
}
于 2013-02-14T19:10:33.680 回答
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 博客文章系列,以了解有关 LINQ to Objects 工作原理的更多信息。

于 2013-02-14T19:10:07.943 回答
0

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

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

于 2013-02-14T19:10:08.400 回答