列表枚举器在放入列表时不起作用.例如,在两个列表的情况下(两个枚举器)
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.
我不明白第一部分的错误是什么,以及如何解决.
这是因为该List<T>.GetEnumerator方法返回一个可变结构. List<T>.Enumerator
当你把它分配给一个变量,并调用MoveNext和Current,它的工作原理.但是当传递给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它将包含返回结构的盒装引用.