当返回类型是IGrouping<TKey, TElement>
或IDictionary<TKey, TValue>
时,我可以使用yield return
吗?
当返回类型是IGrouping<TKey, TElement>
或IDictionary<TKey, TValue>
时,我可以使用yield return
吗?
yield return
适用于以下4种情况:
IEnumerable
IEnumerable<T>
IEnumerator
IEnumerator<T>
这是因为它必须在内部构建一个状态机;使用字典等方式不可行。当然,你也可以返回一个适当的类型而不使用 yield return
。
你可以返回 IEnumerable<KeyValuePair<K,V>>
,这类似于一个字典。然后你可以使用 yield return 返回 KeyValuePairs。甚至可以在另一个方法中包装它,以创建返回的字典。第一个方法唯一无法保证的是键的唯一性。
IEnumerator
、IEnumerator<T>
、IEnumerable
或IEnumerable<T>
时,才能使用yield return
语句。IEnumerator
和IEnumerator<T>
,其中T
是迭代器的yield类型。
[...]
来自§10.14.5:
可枚举对象具有以下特征:
IEnumerable
和 IEnumerable<T>
接口,其中 T
是迭代器的 yield 类型。[...]
ToDictionary
或GroupBy
,您就可以得到相同的结果。如果需要从多个位置调用它,请将其放入一个单行包装方法中。我不这么认为。虽然文档没有明确说明,但措辞的方式暗示它只能在方法的返回类型为IEnumerable
或IEnumerable<T>
时使用。你可能可以编写一个类来实现IGrouping
,给定一个IEnumerable
(这将从你的方法中使用yield return
返回),但这真的是唯一的选择。
您可以始终使用存储库或列表创建IAsyncEnumerable<KeyValuePair<T,V>>,并使用yield return new KeyValuePair<T,V>(obj1,obj2)返回一个新的键值对。然后再编写第二个函数来调用上述方法,该方法返回'IAsyncEnumerable<KeyValuePair<T,V>>',将其添加到字典中,并在if (!dic.TryGetValue(output.Key,out object s))中添加到字典中,假设您想要唯一的键。
不,只是可枚举的 :-)