【问题标题】:Cannot find Any method of IEnumerable<> to do empty check找不到 IEnumerable<> 的任何方法来进行空检查
【发布时间】:2020-07-22 00:43:37
【问题描述】:

我有一个返回IEnumerable&lt;Data&gt; 的方法,我想检查IEnumerable 是否为空/空。我做了一些研究,看起来我们可以使用它的 Any 方法,但在我的代码中我没有看到任何 Any 方法,这意味着我正在运行旧版本的 .Net?

现在我使用上面的方法如下-

private bool Process()
{
    IEnumerable<Data> dataValue = GetData();
    // check if dataValue is null or empty
    if(dataValue != null) {
        // process entry
    }
}

如何检查IEnumerable 在我的情况下是空还是空?

更新

private bool Process()
{
    IEnumerable<Data> dataValue = GetData();
    if(dataValue = null || !dataValue.Any()) {
        return false;
    }
    foreach (var x in dataValue)
    {
        // iterating over dataValue here and extracting each field of Data class
    }
}

【问题讨论】:

  • using System.Linq; 添加到.cs 文件的顶部。
  • null 与being-empty 不同,如果IEnumerable&lt;T&gt;null.Any() 将抛出ArgumentNullExceptionstackoverflow.com/questions/11538243/… - 你需要使用Elvis Operator,例如:Boolean hasAny = enumerable?.Any() ?? false;.
  • 或者创建你自己的扩展IsNullOrEmpty

标签: c# ienumerable


【解决方案1】:

不需要显式Any 检查或null 检查。

foreach (var x in (dataValue ?? Enumerable.Empty<Data>()))

是我的建议,因为它避免了使用Any 的双重枚举问题(并且它将null 视为等同于空)。所以这可能看起来像:

private bool Process()
{
    bool returnValue = false;
    IEnumerable<Data> dataValue = GetData();
    foreach (var x in (dataValue ?? Enumerable.Empty<Data>()))
    {
        returnValue = true;
        // iterating over dataValue here and extracting each field of Data class
    }

    return returnValue;
}

【讨论】:

  • Any() 是一个 O(1) 操作。如果您查看它枚举到第一个项目的源,然后如果找到一个则返回 true。
  • @JoshBerke 如果底层枚举是IQueryable(例如从数据库中获取),那么Any 将导致额外的数据库查询(如果它是yield return 解决方案等可能会出现类似问题) .并且不能保证Any 中使用的数据与foreach 中使用的数据相同(例如)。您不妨阅读jetbrains.com/help/resharper/PossibleMultipleEnumeration.htmlstackoverflow.com/questions/48932548/…stackoverflow.com/questions/8240844/…
  • 好的,我不处理任何影响数据库的 IQueryable 实现(至少不是正常的基础)。很高兴我没有,这似乎是一种反直觉的令人讨厌的副作用。
  • @JoshBerke 这是设计使然,并且有据可查。
  • 仅仅因为它是有意的和有据可查的并不意味着它是一个好的实现。这是一个副作用,当您编写代码时您可能不知道。如果我要编写一个消耗 IEnumerable 的库,并且由于某种原因我不得不对其进行多次枚举,开发人员会出现并发送一个 IQueryable....
【解决方案2】:

你也可以使用

if (dataValue?.Any()==true)
{}

我希望你能说

if(dataValue?.Any())

但这不会编译:-)

【讨论】:

  • if(dataValue?.Any() ?? false) - 只需提供一个默认值即可从您的bool? 获取bool。不知何故看起来比==true更干净@
  • 我不知道看起来仍然很有趣。如果块应该适用于可为空的 类型。
【解决方案3】:

通常

dataValue != null && dataValue.Any()

您可能需要添加using System.Linq;

【讨论】:

    猜你喜欢
    • 2019-10-18
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    相关资源
    最近更新 更多