C# 收益回报仅适用于IEnumerable<;T>;?

C# 收益回报仅适用于IEnumerable<;T>;?,c#,.net,ienumerable,C#,.net,Ienumerable,当返回类型为I分组或I字典时,我是否可以使用yield return?不,只需ienumerable:-)我不这么认为。虽然没有确切地说明它,但它的措辞意味着它只能在方法的返回类型为IEnumerable或IEnumerable时使用。如果给定一个IEnumerable(使用yield return从方法返回),您可能可以编写一个实现iGroup的类,但这实际上是唯一的选择。否,因为迭代器块只是编译器为您构建的状态机。此功能允许您“屈服”并将项目作为序列的一部分 如果返回类型不是IEnumera

当返回类型为
I分组
I字典
时,我是否可以使用
yield return

不,只需ienumerable:-)

我不这么认为。虽然没有确切地说明它,但它的措辞意味着它只能在方法的返回类型为
IEnumerable
IEnumerable
时使用。如果给定一个
IEnumerable
(使用
yield return
从方法返回),您可能可以编写一个实现
iGroup
的类,但这实际上是唯一的选择。

否,因为迭代器块只是编译器为您构建的状态机。此功能允许您“屈服”并将项目作为序列的一部分


如果返回类型不是
IEnumerable
(例如像
IDictionary
)编译器将必须生成实现该接口的方法,而在这一点上,这没有多大意义,因为您将使用集合而不是序列。

但是,您可以返回类似于字典的
IEnumerable
。然后,您将返回KeyValuePairs。您甚至可以使用另一个方法来包装它,该方法使用返回创建字典。第一种方法唯一不能保证的是键的唯一性。

收益回报率
仅适用于4种情况:

  • IEnumerable
  • IEnumerable
  • IEnumerator
  • IEnumerator

这是因为它必须在内部构建一个状态机;有了这个,就不可能有词典(等)。当然,您可以只返回一个合适的类型。

回答:否。
仅当返回类型为
IEnumerator
IEnumerator
IEnumerable
IEnumerable
时,才可以使用
yield-return
语句

根据《公约》第8.14条:

yield语句在迭代器块(§8.2)中用于向迭代器的枚举器对象(§10.14.4)或可枚举对象(§10.14.5)生成值,以表示迭代结束

根据§10.14.4:

枚举器对象具有以下特征:

  • 它实现了
    IEnumerator
    IEnumerator
    ,其中
    T
    是迭代器的产量类型
  • [……]

    根据§10.14.5:

    可枚举对象具有以下特征:

  • 它实现了
    IEnumerable
    IEnumerable
    ,其中
    T
    是迭代器的产量类型

  • […]

    只需调用迭代器方法,然后将
    ToDictionary
    GroupBy
    链接到迭代器之后,就可以得到大致相同的结果。如果您需要从多个地方这样调用它,请将其放在单行包装器方法中。

    语言规范将其详细说明。。。请参阅ECMA 334中的8.18,这样您就失去了O(1)访问时间,必须在每一个KVP中循环找到正确的密钥,最坏的是O(n)次。如果您想自己实现IEnumerable,这里有一篇方便的文章。@Rory是的,自己实现它是一个巨大的PITA,我想不出任何“正常”的理由这样做,现在迭代器块已经存在。我有一些这样的,但这通常是为了在需要构建C#1.2编译器的项目上实现兼容性;不完全是“正常”情况。同意,虽然在某些情况下iGroup可能很好,但使用IEnumerable似乎更容易,因此您可以获得收益率回报的魔力。可能的重复