【问题标题】:Linq method to transform nulls into empty IEnumerable<T>?将空值转换为空 IEnumerable<T> 的 Linq 方法?
【发布时间】:2011-05-24 19:06:54
【问题描述】:

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

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

这里使用合并运算符有点麻烦。我是否遗漏了 LINQ 中处理此问题的某些内容?

【问题讨论】:

标签: c# linq ienumerable


【解决方案1】:

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

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 为解决方案。我认为这是利用扩展方法对null 引用起作用这一事实的一个很好的例子。它通常可以用来优雅地处理空值。
  • @Anders - 同意!我喜欢扩展方法适用于空引用。我们一直使用它们来避免稍微重复的 if-null-then 检查。大多数情况下,它只是节省了一些块格式和额外的换行符,但更重要的是可以让您编写更多的自记录代码(这应该是任何开发人员的目标!)。
  • Answer stackoverflow.com/questions/34645963/… 对 list/array/IEnumerable 有不同的重载
【解决方案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 表达式。

【讨论】:

    【解决方案3】:

    为什么不使用更高效的方法:

    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);
    

    【讨论】:

    • IEnumerable&lt;Transform&gt; 可能无效。 Transform(proc) 是一个方法调用,而不是一个构造函数。它返回的内容目前只有 OP 知道。我推荐一个IEnumerable&lt;YourTypeHere&gt; 占位符。
    • OP 的原始代码将始终具有引用对象的结果,但此代码可能使其为空。如果您正在检查 procs 是否为空,则不需要合并。
    • 这样的效率如何?
    【解决方案4】:

    Linq 需要一个可枚举的东西,即使它是空的。 也许您可以尝试将合并移动到 api 调用之后?

    【讨论】:

      猜你喜欢
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-08
      • 2012-02-24
      • 2011-07-28
      • 1970-01-01
      相关资源
      最近更新 更多