你能解释一下'yield'关键字对Enumerable的影响吗?对于前者我无法理解在下面的代码程序中如何返回IEnumerable类型的对象:
class Program
{
static IEnumerable<T> Merge<T>(IEnumerable<T> left, IEnumerable<T> right)
where T: IComparable<T>
{
IEnumerator<T> l = left.GetEnumerator();
IEnumerator<T> r = right.GetEnumerator();
bool l_has_data = l.MoveNext();
bool r_has_data = r.MoveNext();
while (l_has_data || r_has_data)
{
if (!l_has_data && r_has_data)
{
yield return r.Current;
r_has_data = r.MoveNext();
continue;
}
if (!r_has_data && l_has_data)
{
yield return l.Current;
l_has_data = l.MoveNext();
continue;
}
int comp = l.Current.CompareTo(r.Current);
if (comp < 0)
{
yield return l.Current;
l_has_data = l.MoveNext();
}
else if (comp > 0)
{
yield return r.Current;
r_has_data = r.MoveNext();
}
else
{
yield return l.Current;
yield return r.Current;
l_has_data = l.MoveNext();
r_has_data = r.MoveNext();
}
}
}
如果我将鼠标悬停在'.Current'上,它会告诉我'这个'获取枚举器当前位置的元素'。
答案 0 :(得分:1)
MSDN日期:
yield关键字向编译器发出信号通知它所在的方法 出现是一个迭代器块。编译器生成一个类 实现迭代器块中表达的行为。在里面 iterator块,yield关键字与return一起使用 用于为枚举器对象提供值的关键字。这是价值 例如,在foreach语句的每个循环中返回。
简单来说:
yield return
返回Collection of Object
而不是返回single object
static void Main(string[] args)
{
int[] numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// supposed u need to find all the numbers which are greater then 5
// in general it could have been done like
foreach (int number in numbers)
{
if (number > 5)
{
Console.WriteLine(number);
}
}
// what if u needed the numbers that are greater then 5 multiple times, each time you would have to start a loop
// yield return helps to return a collection of int
var needed_numbers = NeededNumbers(numbers);
foreach (int neededNumber in needed_numbers)
{
Console.WriteLine(neededNumber);
}
}
private static IEnumerable<int> NeededNumbers(int[] nums)
{
foreach (int number in nums)
{
if (number > 5)
{
yield return number;
}
}
}
来自DotNetPerls的报价
yield return语句在语义上等同于return 语句(将控制流传递给调用方法),然后是 通过“goto”到下一次迭代中的yield语句 foreach循环。
答案 1 :(得分:0)
来自MS Docs:
在语句中使用yield上下文关键字时,表示 出现在其中的方法,运算符或获取访问器是 迭代器。使用yield定义迭代器可消除对 显式的额外类(包含状态的类 枚举,请参见IEnumerator的示例) 自定义集合类型的IEnumerable和IEnumerator模式。