如果源不为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扩展/自定义的更多信息。
感谢。
答案 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,则应返回空序列。