将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中遗漏了一些处理此问题的内容?
这实际上与您的解决方案相同,但我使用了一个扩展方法。
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调用之后将合并移到?