gpt4 book ai didi

C# 迭代器在组合两个 IEnumerable 方法时执行两次

转载 作者:太空宇宙 更新时间:2023-11-03 11:49:13 25 4
gpt4 key购买 nike

我刚开始学习 C# 迭代器,但在阅读程序输出后对程序流程感到困惑。带有 uniqueVals 的 foreach 似乎执行了两次。我的理解是前几行到“方形数字:3”之前的那一行不应该存在。谁能帮忙解释一下为什么会这样?

输出是:

Unique: 1Adding to uniqueVals: 1Unique: 2Adding to uniqueVals: 2Unique: 2Unique: 3Adding to uniqueVals: 3Nums in Square: 3Unique: 1Adding to uniqueVals: 1Square: 1Number returned from Unique: 1Unique: 2Adding to uniqueVals: 2Square: 2Number returned from Unique: 4Unique: 2Unique: 3Adding to uniqueVals: 3Square: 3Number returned from Unique: 9
static class Program
{
public static IEnumerable<T> Unique<T>(IEnumerable<T> sequence)
{
Dictionary<T, T> uniqueVals = new Dictionary<T, T>();

foreach (T item in sequence)
{
Console.WriteLine("Unique: {0}", item);
if (!uniqueVals.ContainsKey(item))
{
Console.WriteLine("Adding to uniqueVals: {0}", item);
uniqueVals.Add(item, item);
yield return item;
Console.WriteLine("After Unique yield: {0}", item);
}
}
}

public static IEnumerable<int> Square(IEnumerable<int> nums)
{
Console.WriteLine("Nums in Square: {0}", nums.Count());
foreach (int num in nums)
{
Console.WriteLine("Square: {0}", num);
yield return num * num;
Console.WriteLine("After Square yield: {0}", num);
}
}

static void Main(string[] args)
{
var nums = new int[] { 1, 2, 2, 3 };
foreach (int num in Square(Unique(nums)))
Console.WriteLine("Number returned from Unique: {0}", num);
Console.Read();
}

}

最佳答案

IEnumerables 没有为 Enumerable 的大小定义任何字段,扩展方法 Count 试图通过遍历整个集合并告诉您它找到了多少项来为您完成这项工作。

Unique 的第一次迭代来自这一行:

Console.WriteLine("方 block 中的数字:{0}", nums.Count());

第二次迭代如预期的那样来自您的 foreach 循环。

关于C# 迭代器在组合两个 IEnumerable 方法时执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2513143/

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