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给出了两个选项:)先试试收益率突破法——它更简单