C#中是否存在Python的iter()和next()函数的等效实现?
C# 中与 Python iter() 和 next() 等效的功能
Python 里的iter()和next()对应 C# 中的**枚举器(Enumerator)**机制,核心依托IEnumerable<T>和IEnumerator<T>接口实现:
- 对应
iter()的是GetEnumerator()方法:任何实现IEnumerable<T>的集合(比如List<T>、数组、自定义序列等)都可调用该方法获取枚举器实例。 - 对应
next()的是IEnumerator<T>的MoveNext()方法 +Current属性:MoveNext()会将枚举器推进到下一个元素,返回bool值表示是否还有剩余元素;Current用于获取当前指向的元素。当没有更多元素时,MoveNext()返回false,作用等同于 Python 的StopIteration异常。
等效实现:合并两个有序列表
以下是你提供的 Python 合并代码的 C# 等效版本,同样不使用 for 循环和索引,完全基于枚举器实现:
using System; using System.Collections.Generic; public static IEnumerable<int> Merge(IEnumerable<int> nums1, IEnumerable<int> nums2) { using var enumerator1 = nums1.GetEnumerator(); using var enumerator2 = nums2.GetEnumerator(); bool hasNext1 = enumerator1.MoveNext(); bool hasNext2 = enumerator2.MoveNext(); int num1 = enumerator1.Current; int num2 = enumerator2.Current; while (true) { if (num1 <= num2) { yield return num1; hasNext1 = enumerator1.MoveNext(); if (!hasNext1) { yield return num2; while (enumerator2.MoveNext()) { yield return enumerator2.Current; } break; } num1 = enumerator1.Current; } else { yield return num2; hasNext2 = enumerator2.MoveNext(); if (!hasNext2) { yield return num1; while (enumerator1.MoveNext()) { yield return enumerator1.Current; } break; } num2 = enumerator2.Current; } } } public class Program { public static void Main() { var nums1 = Range(0, 10, 2); var nums2 = Range(1, 20, 3); foreach (var num in Merge(nums1, nums2)) { Console.Write(num + " "); } // 输出:0 1 2 4 7 8 10 13 16 19 } // 模拟Python的range生成序列 private static IEnumerable<int> Range(int start, int end, int step) { for (int i = start; i < end; i += step) { yield return i; } } }
关键细节说明
GetEnumerator():获取集合的枚举器实例,对应 Python 的iter()。C# 中枚举器实现了IDisposable,因此用using语句自动释放资源。MoveNext()和Current:两者组合对应 Python 的next()。MoveNext()负责推进枚举器位置,返回值判断是否还有元素;Current获取当前位置的元素。yield return:和 Python 的yield语法逻辑一致,用于创建延迟执行的迭代器方法,避免一次性加载所有数据到内存。
内容的提问来源于stack exchange,提问作者joseville
相关产品推荐
相关产品推荐

