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似乎更容易,因此您可以获得收益率回报的魔力。可能的重复