Enumerableに関して「yield」キーワードがどのように機能するか説明していただけますか?例:以下のコードで、プログラムが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'にカーソルを合わせると、'列挙子の現在の位置にある要素を取得する'と表示されます。