我正在处理从第三方API返回给我的一些数组。有时它们会以null
的形式返回。除了null case之外,我能够使用LINQ优雅地处理所有内容。我想出了类似的东西:
IEnumerable<Thing> procs = APICall(foo, bar);
var result = from proc in procs ?? Enumerable.Empty<Thing>()
where proc != null
select Transform(proc);
这里使用聚结操作员有点麻烦。我错过了处理这个问题的LINQ吗?
答案 0 :(得分:12)
这实际上与您的解决方案相同,但我使用的是扩展方法。
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);
答案 1 :(得分:2)
您可以写下以下内容:
IEnumerable<Thing> procs = APICall(foo, bar) ?? Enumerable.Empty<Thing>();
var result = from proc in procs
where proc != null
select Transform(proc);
这样你就可以在linq表达式之外移动合并,这使得代码看起来更紧凑。
你也可以通过对nonnull进行条件检查来完全跳过linq表达式。
答案 2 :(得分:1)
为什么不使用更高效的东西,如:
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);
答案 3 :(得分:0)
Linq期待一些东西,即使它是空的。 也许你可以尝试在api调用之后将合并移动到?