yield return仅适用于IEnumerable <t>?</t>

时间:2009-07-01 19:46:34

标签: c# .net ienumerable

如果返回类型为yield returnIGrouping<TKey, TElement>,我可以使用IDictionary<TKey, TValue>吗?

7 个答案:

答案 0 :(得分:43)

yield return适用于4种情况:

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

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

答案 1 :(得分:16)

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

答案 2 :(得分:5)

答案:不可以。仅当返回类型为yield returnIEnumeratorIEnumerator<T>IEnumerable时,才能使用IEnumerable<T>语句。

来自C# 3.0 spec的§8.14:

yield语句在迭代器块(第8.2节)中使用,以产生迭代器的枚举器对象(第10.14.4节)或可枚举对象(第10.14.5节)的值,或表示迭代结束的信号

来自§10.14.4:

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

  1. 它实现了IEnumeratorIEnumerator<T>,其中T是迭代器的yield类型。
  2. [...]

    来自§10.14.5:

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

    1. 它实现了IEnumerableIEnumerable<T>,其中T是迭代器的yield类型。
    2. [...]

答案 3 :(得分:2)

不,因为迭代器块只是编译器代表您构建的状态机。此功能允许您“生成”和项目作为序列的一部分。

如果返回类型不是IEnumerable<T>(例如IDictionary),则编译器必须生成实现该接口的方法,并且在那时它没有多大意义,因为你会使用集合而不是序列。

答案 4 :(得分:2)

只需调用迭代器方法并在其后面链ToDictionaryGroupBy,你就会有同样的事情。如果您需要从多个地方调用它,请将其放在单行包装器中。

答案 5 :(得分:1)

我不这么认为。虽然documentation并没有完全拼写出来,但它的措辞意味着它只能在方法的返回类型为IEnumerableIEnumerable<T>时使用。您可以编写一个实现IGrouping的类,给定IEnumerable(将使用yield return从您的方法返回),但这是唯一的选项。

答案 6 :(得分:0)

不,只是不可数: - )