如果返回类型为yield return
或IGrouping<TKey, TElement>
,我可以使用IDictionary<TKey, TValue>
吗?
答案 0 :(得分:43)
yield return
适用于4种情况:
IEnumerable
IEnumerable<T>
IEnumerator
IEnumerator<T>
这是因为它必须在内部构建状态机;这是不可能的字典(等)。你当然可以return
代替合适的类型。
答案 1 :(得分:16)
然而,您可以返回与字典类似的IEnumerable<KeyValuePair<K,V>>
。然后,您将返回KeyValuePairs。您甚至可以使用另一种在返回时创建字典的方法来包装它。第一种方法唯一不能保证的是密钥的唯一性。
答案 2 :(得分:5)
答案:不可以。仅当返回类型为yield return
,IEnumerator
,IEnumerator<T>
或IEnumerable
时,才能使用IEnumerable<T>
语句。
来自C# 3.0 spec的§8.14:
yield语句在迭代器块(第8.2节)中使用,以产生迭代器的枚举器对象(第10.14.4节)或可枚举对象(第10.14.5节)的值,或表示迭代结束的信号
来自§10.14.4:
枚举器对象具有以下特征:
IEnumerator
和IEnumerator<T>
,其中T
是迭代器的yield类型。[...]
来自§10.14.5:
可枚举对象具有以下特征:
IEnumerable
和IEnumerable<T>
,其中T
是迭代器的yield类型。[...]
答案 3 :(得分:2)
不,因为迭代器块只是编译器代表您构建的状态机。此功能允许您“生成”和项目作为序列的一部分。
如果返回类型不是IEnumerable<T>
(例如IDictionary
),则编译器必须生成实现该接口的方法,并且在那时它没有多大意义,因为你会使用集合而不是序列。
答案 4 :(得分:2)
只需调用迭代器方法并在其后面链ToDictionary
或GroupBy
,你就会有同样的事情。如果您需要从多个地方调用它,请将其放在单行包装器中。
答案 5 :(得分:1)
我不这么认为。虽然documentation并没有完全拼写出来,但它的措辞意味着它只能在方法的返回类型为IEnumerable
或IEnumerable<T>
时使用。您可以编写一个实现IGrouping
的类,给定IEnumerable
(将使用yield return
从您的方法返回),但这是唯一的选项。
答案 6 :(得分:0)
不,只是不可数: - )