比較を通じて、異なるタイプの2つの列挙可能オブジェクトを反復処理するロジックを作成しているときに、次のことがわかりました。
class Program
{
public static IEnumerable<mm> YieldlyGet()
{
yield return new mm { Int = 0 };
yield return new mm { Int = 1 };
yield return new mm { Int = 2 };
yield return new mm { Int = 3 };
yield return new mm { Int = 4 };
yield return new mm { Int = 5 };
}
public static IEnumerable<int> YieldlyGetInt()
{
yield return 0;
yield return 1;
yield return 2;
yield return 3;
yield return 4;
yield return 5;
}
public static IEnumerable<int> Get()
{
return new List<int> { 0, 1,2,3,4,5 };
}
static void Main(string[] args)
{
var yieldr = YieldlyGet().GetEnumerator();
var yieldv = YieldlyGetInt().GetEnumerator();
var list = Get().GetEnumerator();
int i = -1;
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.WriteLine("For the current index: {0}", ++i);
Console.WriteLine("y-r: Should I move next? {0}, if yes, value: {1}", yieldr.MoveNext(), yieldr.Current != null ? yieldr.Current.Int : 0);
Console.WriteLine("y-v: Should I move next? {0}, if yes, value: {1}", yieldv.MoveNext(), yieldv.Current);
Console.WriteLine("l: Should I move next? {0}, if yes, value: {1}", list.MoveNext(), list.Current);
Console.ReadLine();
}
問題は、私が最後の位置の後にいるとき、リストはデフォルトを表示しますが、yieldによって作成されたイテレーターは最後の値を表示し続けます。
現在のインデックスの場合:6
年:次に移動する必要がありますか?False、はいの場合、値:5
yv:次に移動する必要がありますか?False、はいの場合、値:5
l:次に移動する必要がありますか?False、yesの場合、値:0
なんで?