迭代迭代器列表linq

Dej*_*jan 1 c# linq iterator

列表枚举器在放入列表时不起作用.例如,在两个列表的情况下(两个枚举器)

public void test()
{
    var firstList = new List<int>() { 1, 2, 3 };
    var secondList = new List<int>() { 4, 5, 6 };
    var lists = new List<List<int>>();
    lists.Add(firstList);
    lists.Add(secondList);

    // Not working
    var iterators = lists.Select(x => x.GetEnumerator()).ToList();
    iterators.ForEach(x => x.MoveNext());
    iterators.ForEach(x => Console.WriteLine(x.Current));

    // Working
    var firstIterator = iterators[0]; 
    var secondIterator = iterators[1];
    firstIterator.MoveNext(); secondIterator.MoveNext();
    Console.WriteLine(firstIterator.Current);
    Console.WriteLine(secondIterator.Current);
}
Run Code Online (Sandbox Code Playgroud)

第一部分不工作,它打印0 0,而第二部分工作,它打印1 4.

我不明白第一部分的错误是什么,以及如何解决.

Iva*_*oev 6

这是因为该List<T>.GetEnumerator方法返回一个可变结构. List<T>.Enumerator

当你把它分配给一个变量,并调用MoveNextCurrent,它的工作原理.但是当传递给delegate时,它会按值传递,因此委托会收到一个副本,因此调用MoveNext对原始文件没有影响struct Current.

只是可变结构的副作用之一.

如果你改变了

x => x.GetEnumerator()
Run Code Online (Sandbox Code Playgroud)

x => (IEnumerator<int>)x.GetEnumerator()
Run Code Online (Sandbox Code Playgroud)

要么

x => x.AsEnumerable().GetEnumerator()
Run Code Online (Sandbox Code Playgroud)

两个片段都可以工作,因为现在iterators它将包含返回结构的盒装引用.