将null转换为空IEnumerable<;T>;

本文关键字:lt gt IEnumerable null 转换 | 更新日期: 2023-09-27 17:57:39

我正在处理一些从第三方API返回给我的数组。有时这些会以null的形式返回。我能够用LINQ优雅地处理所有事情,除了null情况。我想出了这样的东西:

IEnumerable<Thing> procs = APICall(foo, bar);
var result = from proc in procs ?? Enumerable.Empty<Thing>()
    where proc != null
    select Transform(proc);

这里使用聚结运算符有点恼火。我是不是从LINQ中遗漏了一些处理此问题的内容?

将null转换为空IEnumerable<;T>;

这实际上与您的解决方案相同,但我使用了一个扩展方法。

public static partial class EnumerableExtensions
{
    public static IEnumerable<T> EmptyIfNull<T>(this IEnumerable<T> source)
    {
        return source ?? Enumerable.Empty<T>();
    }
}

因此,我们最终得到:

IEnumerable<Thing> procs = APICall(foo, bar);
var result = from proc in procs.EmptyIfNull()
             where proc != null
             select Transform(proc);

您只需编写以下内容:

IEnumerable<Thing> procs = APICall(foo, bar) ?? Enumerable.Empty<Thing>();
var result = from proc in procs
    where proc != null
    select Transform(proc);

通过这种方式,您可以将合并移到linq表达式之外,从而使代码看起来更加紧凑。

您也可以通过对nonnull进行条件检查来完全跳过linq表达式。

为什么不使用更高效的东西,比如:

IEnumerable<Thing> procs = APICall(foo, bar);
IEnumerable<Transform> result = null;
if(procs != null)
    result = from proc in procs ?? Enumerable.Empty<Thing>()
         where proc != null
         select Transform(proc);

Linq期望某个东西的整数,即使它是空的。也许您可以尝试在api调用之后将合并移到?