C# 如何在IEnumerable中验证收益率返回默认值?

C# 如何在IEnumerable中验证收益率返回默认值?,c#,asp.net,ienumerable,C#,Asp.net,Ienumerable,我试图检查IEnumerable是否为null或空,但不知何故,每当它为空时,我的if检查总是失败 private bool Update() { IEnumerable<RecordHolder> recordHolders = GetData(); // below check doesn't work if (recordHolders == null || !recordHolders.Any())

我试图检查
IEnumerable
是否为null或空,但不知何故,每当它为空时,我的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
    }
private bool Update()
{
IEnumerable recordHolders=GetData();
//下面的检查不起作用
if(recordHolders==null | |!recordHolders.Any())
返回false;
//…其他代码
}
公共IEnumerable GetData()
{
var issucess=PullRemote(url);
如果(!issucess.Result){yield return default;}
//…其他代码
}
每当我的
GetData()
方法返回
yield return default
时,随后的
if
检入
Update
方法就不起作用。我做错什么了吗


我原以为我的if check-in
Update
方法将能够捕获
收益率返回默认值
,但看起来我错了。

我想你是在寻找
收益率中断
而不是
收益率返回默认值
。或者,您可以在常规方法(而不是迭代器块)中执行操作的第一部分,并在特殊情况下返回失败情况(
Array.Empty()
是常见的选择),遵从迭代器块(或
Select
投影)对于成功案例。

当您返回默认值时,您将返回RecordHolder的默认值,该值为空

因此,IEnumerable将包含1个null项

尝试返回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;}
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
公共课程
{
公共静态void Main()
{
var result=GetData();
Console.WriteLine(result.Count());//打印1
}
公共静态IEnumerable GetData()
{
违约收益率;
}
公共类MyClass
{
公共字符串MyProperty{get;set;}
}
}

这里的示例:

另外,
yield return default
不会终止序列,因此无论“其他代码”做了什么:都将继续发生-这意味着我们不知道在测试之后会或不会出现什么结果default@MarcGravell没有循环,
屈服返回默认值
只执行一次,因此,序列中只有一项
.GetEnumerator()
.MoveNext()
true
)>
.Current
default
)>
.MoveNext()
false
)。@aepot我在原始帖子中谈论的代码;由于没有“else”,无论该方法做了什么其他事情:都会发生,即“/…其他一些代码”,您是否尝试了
屈服中断?我现在搞糊涂了。如果可能的话,你能提供一个我的代码示例,比如我应该在这里做什么?这将帮助我更好地理解。你是说我应该在那里使用
收益率中断
?就这样?或者你是说我应该改变整个方法,在这里使用普通列表?@johni给出了两个选项:)先试试收益率突破法——它更简单