gpt4 book ai didi

c# - 双重使用 C# 迭代器工作意外

转载 作者:行者123 更新时间:2023-11-30 14:30:04 24 4
gpt4 key购买 nike

这是我第一次使用 C# 编写代码 - 我有 C/Python/Javascript/Haskell 的背景。

为什么下面的程序有效?我希望它能在 Haskell 中工作,因为列表是不可变的,但我正在努力研究如何使用相同的迭代器 nums 两次,而不会出错。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
var nums = new List<int?>() { 0, 0, 2, 3, 3, 3, 4 };
var lastNums = new List<int?>() { null } .Concat(nums);
var changesAndNulls = lastNums.Zip(nums,
(last, curr) => (last == null || last != curr) ? curr : null
);
var changes = from changeOrNull in changesAndNulls where changeOrNull != null select changeOrNull;

foreach (var change in changes) {
Console.WriteLine("change: " + change);
}
}
}
}

最佳答案

在您的代码中 nums不是 IEnumerator<T> (迭代器),它是 IEnumarable<T>IEnumarable <T>GetEnumerator()可以根据需要多次调用的方法:

IEnumerable<int?> nums = new List<int?>() { 0, 0, 2, 3, 3, 3, 4 };

// Linq gets enumerator to do Concat
using (var iterator1 = nums.GetEnumerator()) {
while (iterator1.MoveNext()) {
...
}
}

...

// Linq gets (fresh!) enumerator to do Zip
using (var iterator2 = nums.GetEnumerator()) {
while (iterator2.MoveNext()) {
...
}
}

所以 IEnumerable<T>是一个生产IEnumerator<T>工厂实例(这是一个不能重新使用IEnumerator<T>)

关于c# - 双重使用 C# 迭代器工作意外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24447743/

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