【发布时间】:2014-06-27 08:53:15
【问题描述】:
这是我第一次使用 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>,它是IEnumerable<T>',它有GetEnumerator()方法来调用任意时间 -
@AdamHouldsworth
nums和lastNums都作为迭代器访问nums,并在Zip中并行使用。 -
@chrisdew
nums不是一个“迭代器”,它是一个“可迭代的”集合,只是被迭代两次,这是允许的,因为遍历它的每个迭代器都是自己独立的状态机。