C# 中是否存在与 Python 的 iter() 和 next() 函数等效的函数?

问题描述 投票:0回答:1

Python 的

iter(.)
next(.)
内置函数允许迭代列表(或实现
__iter__(self)
__next__(self)
的其他对象),无需 for 循环且无需索引。

C# 有相当于

iter(.)
next(.)
的东西吗?


假设由于某种原因您想要合并两个列表排序数字而不使用 for 循环或索引。您可以使用迭代器和

next(.)
来执行此操作,如下所示:

def merge(nums1, nums2):
    nums1Iter = iter(nums1)
    nums2Iter = iter(nums2)
    num1 = next(nums1Iter)
    num2 = next(nums2Iter)
    while True:
      if num1 <= num2:
        yield num1
        try:
          num1 = next(nums1Iter)
        except StopIteration:
          yield num2
          yield from nums2Iter
          break
      else:
        yield num2
        try:
          num2 = next(nums2Iter)
        except StopIteration:
          yield num1
          yield from nums1Iter
          break

nums1 = range(0, 10, 2)
nums2 = range(1, 20, 3)
print(list(merge(nums1, nums2)))
python c# iterator ienumerator
1个回答
0
投票

是的,C# 称它们为 Enumerators

IEnumerator Iterface
IEnumerator<T> Interface
各有一个
MoveNext
方法一
Current
属性,可让您按如下方式进行迭代:

int[] numsArr = {1, 2, 3, 4, 5};
IEnumerator numsEnumerator = numsArr.GetEnumerator();
int num;
while (numsEnumerator.MoveNext()) {
  num = (int) numsEnumerator.Current;
}

会打印出:

1
2
3
4
5

备注:

  • 数组、列表和其他类都有一个
    GetEnumerator
    方法,您可以使用该方法获取数组、列表等对象的枚举器。
  • IEnumerator.Current
    属于
    object
    类型,因此如果将其值分配给类型化变量,则必须进行显式转换(不确定 类型化变量 是否是此处合适的术语)。否则,您将收到
    Cannot implicitly convert type 'object' to ...
    错误。
© www.soinside.com 2019 - 2024. All rights reserved.