Linq方法将null转换为空IEnumerable <t>?</t>

时间:2011-05-24 19:06:55

标签: c# linq ienumerable

我正在处理从第三方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吗?

4 个答案:

答案 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调用之后将合并移动到?