【问题标题】:The operand of yield return in c#c#中yield return的操作数
【发布时间】:2021-11-18 20:45:33
【问题描述】:

我已经开始学习迭代器方法和 C# 中 IEnumerators 的实现。我对 yield return 语句感到困惑。

假设,我创建了一个迭代器方法“Iterator()”,并且我有一个包含“TCustom”类型项目的集合“myCollection”。 myCollection 是实现 'IEnumerable' 的集合类型,但类型 'TCustom' 没有实现它。

IEnumerable Iterator()
{ 
  foreach(TCustom item in myCollection)
   {
     yield return item;
   }
}

class RandomCollection : IEnumerable{....}
class TCustom {....}
RandomCollection myCollection = new RandomCollection();

所以 yield 语句从“myCollection”返回“TCustom”类型的“item”对象。如果“TCustom”是从我的源代码创建的自定义类型,它是否必须实现 IEnumerable 接口?而如果'TCustom'类型没有实现'IEnumerable'接口,它可以是yield return语句的返回类型吗? (yield return item;)

【问题讨论】:

  • yield return 生成集合中的各个项目,因此 T 不必(通常也不会)实现 IEnumerable。
  • 仅供参考,单个 T 通常是泛型中类型的占位符,而不是特定类。一开始让我很困惑????
  • @HansKesting 感谢您的更正
  • 这取决于集合的类型。如果是IEnumerable<int>,则必须提供int。如果只是IEnumerable,它可以是任何object
  • 再次:你在 yield return 中返回的不是集合,它是一个单独的元素。只有所有遇到的收益返回一起形成最终集合。

标签: c# ienumerable yield-return


【解决方案1】:

IEnumerable 是一个接口,它定义了一个方法 GetEnumerator,它返回一个 IEnumerator 接口,这反过来又允许对集合进行只读访问。实现 IEnumerable 的集合可以与 foreach 语句一起使用。

定义

IEnumerable 

public IEnumerator GetEnumerator();

IEnumerator

public object Current;
public void Reset();
public bool MoveNext();

example code from codebetter.com

IEnumerator 是一个可以枚举的东西:它具有Current 属性以及MoveNextReset 方法(在.NET 代码中您可能不会显式调用它们,尽管您可以)。

IEnumerable 是一个可以枚举的东西...这仅仅意味着它有一个 GetEnumerator 方法,该方法返回一个 IEnumerator

你用哪个?使用IEnumerator 的唯一原因是,如果您有某种非标准的枚举方式(即逐个返回其各种元素),并且您需要定义其工作方式。您将创建一个实现IEnumerator 的新类。但是您仍然需要在 IEnumerable 类中返回 IEnumerator

要查看枚举器(实现IEnumerator<T>)的外观,请参阅任何Enumerator<T> 类,例如包含在List<T>Queue<T>,Stack<T> 中的类。要查看实现 IEnumerable 的类,请参阅任何标准集合类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    相关资源
    最近更新 更多