yield return仅适用于IEnumerable <T>?

Jad*_*ias 31 .net c# ienumerable

yield return当返回类型是a IGrouping<TKey, TElement>还是IDictionary<TKey, TValue>?时,我可以使用吗?

Mar*_*ell 46

yield return 适用于4种情况:

  • IEnumerable
  • IEnumerable<T>
  • IEnumerator
  • IEnumerator<T>

这是因为它必须在内部构建状态机; 这是不可能的字典(等).你当然可以return选择合适的类型.


Tim*_*ter 17

然而IEnumerable<KeyValuePair<K,V>>,您可以返回类似于字典的内容.然后,您将返回KeyValuePairs.您甚至可以使用另一种在返回时创建字典的方法来包装它.第一种方法唯一不能保证的是密钥的唯一性.

  • 然后你失去了O(1)访问时间,并且必须循环每一个KVP以找到正确的密钥,在最坏的O(n)次. (10认同)

jas*_*son 5

答:编号A yield return语句只能如果返回类型为使用IEnumeratorIEnumerator<T>IEnumerable,或IEnumerable<T>

根据C#3.0规范的第 8.14节:

yield语句用于迭代器块(第8.2节)中,以将值产生给迭代器的枚举器对象(第10.14.4节)或可枚举的对象(第10.14.5节),或用信号通知迭代结束。

从§10.14.4开始:

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

  1. 它实现IEnumeratorIEnumerator<T>T迭代器的yield类型在哪里。

[...]

从§10.14.5开始:

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

  1. 它实现IEnumerableIEnumerable<T>T迭代器的yield类型在哪里。

[...]