gpt4 book ai didi

c# - 遍历迭代器列表 linq

转载 作者:太空宇宙 更新时间:2023-11-03 18:03:02 26 4
gpt4 key购买 nike

如果将枚举器放入列表中,则列表枚举器不起作用。例如,如果有两个列表(两个枚举器)

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);
}

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

我不明白第一部分有什么错误以及如何解决。

最佳答案

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

当您将其分配给变量并调用 MoveNext 时和 Current , 有用。但是当传递给委托(delegate)时,它是按值传递的,因此委托(delegate)会收到一个副本,因此调用 MoveNext对原来的struct没有影响Current .

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

如果你改变

x => x.GetEnumerator()

x => (IEnumerator<int>)x.GetEnumerator()

x => x.AsEnumerable().GetEnumerator()

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

关于c# - 遍历迭代器列表 linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44197910/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com