【问题标题】:How to validate yield return default in IEnumerable?如何在 IEnumerable 中验证收益返回默认值?
【发布时间】:2020-08-08 07:19:39
【问题描述】:

我正在尝试检查 IEnumerable<> 是否为空或为空,但不知何故,只要它为空,我的 if 检查总是失败。

    private bool Update()
    {
        IEnumerable<RecordHolder> recordHolders = GetData();
        // below  check doesn't work
        if (recordHolders == null || !recordHolders.Any())
            return false;

        // .. some other code
    }

    public IEnumerable<RecordHolder> GetData()
    {
        var isSuccess = PullRemote(url);
        if (!isSuccess.Result) { yield return default; }

        // .. some other code
    }

每当我的GetData() 方法返回yield return default 时,随后的if 签入Update 方法就不起作用。我做错什么了吗?

我以为我的 if check in Update 方法将能够捕获 yield return default 但我错了。

【问题讨论】:

  • 你试过yield break;吗?

标签: c# asp.net ienumerable


【解决方案1】:

我认为您正在寻找 yield break 而不是 yield return default。或者,您可以在 regular 方法(不是迭代器块)中执行操作的第一部分,并在特殊情况下返回失败情况(Array.Empty&lt;T&gt;() 是常见的选择),推迟到成功案例的迭代器块(或Select 投影)。

【讨论】:

  • 我现在很困惑。如果可能的话,你能用我的代码提供一个例子,比如我应该在这里做什么?它将帮助我更好地理解。你是说我应该在那里使用yield break吗?就是这样?还是你说我应该改变整个方法并在这里使用普通列表?
  • @john 我给了这两个选项 :) 先尝试 yield break 一个 - 它更简单
【解决方案2】:

当您执行 yield return default 时,您将返回 RecordHolder 的默认值为 null。

所以您的 IEnumerable 将包含 1 个为空的项目。

尝试返回 Enumerable.Empty() 或 Array.Empty();而不是你的收益回报默认值。

例子

using System;
using System.Collections.Generic;
using System.Linq;
                
public class Program
{
    public static void Main()
{
    var result = GetData();
    Console.WriteLine(result.Count()); // Prints 1
}

public static IEnumerable<MyClass> GetData()
{
    yield return default;
}

public class MyClass
{
        public string MyProperty {get;set;}
    }
}

此处示例:https://dotnetfiddle.net/vVefPx

【讨论】:

  • 另外,yield return default 不会终止序列,因此无论“其他代码”做什么:仍然会发生 - 这意味着我们不知道可能会或可能不会出现什么结果 默认之后
  • @MarcGravell 没有循环,yield return default 只会执行一次,因此序列中只有一项。 .GetEnumerator() > .MoveNext() (true) > .Current (default) > .MoveNext() (false)。
  • @aepot 我说的是原帖中的代码;因为没有“else”,无论该方法做什么其他事情:都会发生,即“// .. some other code”
猜你喜欢
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 1970-01-01
  • 2016-10-04
  • 2011-05-05
  • 2017-08-10
  • 2020-04-21
  • 2018-01-23
相关资源
最近更新 更多