Могу ли я использовать yield return
, когда тип возврата является IGrouping<TKey, TElement>
или IDictionary<TKey, TValue>
?
Return return работает только для IEnumerable <T>?
Ответ 1
yield return
работает ровно в 4 случаях:
-
IEnumerable
-
IEnumerable<T>
-
IEnumerator
-
IEnumerator<T>
Это связано с тем, что он должен строить внутреннюю машину состояния; словарь (и т.д.) с этим невозможен. Вы можете, конечно, выбрать return
подходящий тип.
Ответ 2
Однако вы могли бы вернуть IEnumerable<KeyValuePair<K,V>>
, который будет похож на словарь. Затем вы получите доход KeyValuePairs. Вы можете даже обернуть это другим методом, который создает словарь из возврата. Единственное, что первый метод не гарантировал, - это уникальность в ключах.
Ответ 3
Ответ: Нет. Оператор A yield return
может использоваться только в том случае, если тип возврата IEnumerator
, IEnumerator<T>
, IEnumerable
или IEnumerable<T>
.
Из §8.14 спецификация С# 3.0:
Оператор yield используется в блоке итератора (§8.2), чтобы получить значение для объекта перечислителя (§10.14.4) или перечислимого объекта (§10.14.5) итератора или для указания конца итерации.
Из §10.14.4:
Объект перечислителя имеет следующие характеристики:
- Он реализует
IEnumerator
иIEnumerator<T>
, гдеT
- тип выходных данных итератора.
[...]
Из §10.14.5:
Перечислимый объект имеет следующие характеристики:
- Он реализует
IEnumerable
иIEnumerable<T>
, гдеT
- тип выходных данных итератора.
[...]
Ответ 4
Нет, потому что блок итератора - это просто автомат, созданный от вашего имени компилятором. Эта функция позволяет вам "выдать" и элемент как часть последовательности.
Если тип возврата был отличным от IEnumerable<T>
(например, IDictionary
), компилятор должен был бы генерировать методы для реализации этого интерфейса, и в этот момент это не имело бы большого смысла, потому что вы будете работать с а не последовательности.
Ответ 5
Просто вызовите метод итератора и цепочку ToDictionary
или GroupBy
после него, и у вас будет одно и то же. Поместите это в однострочный метод обертки, если вам нужно вызвать его так, как из нескольких мест.
Ответ 6
Я так не думаю. В то время как документация точно не описывает его, то, как он сформулирован, подразумевается, что его можно использовать только тогда, когда возвращаемый тип метода либо IEnumerable
, либо IEnumerable<T>
. Возможно, вы сможете написать класс, который реализует IGrouping
с учетом IEnumerable
(который будет возвращен из вашего метода с помощью yield return
), но это действительно единственный вариант.
Ответ 7
нет, просто ienumerable: -)
Ответ 8
Как yield return
можно использовать с типами как IEnumerator<T>
, почему бы не сделать что-то подобное?
internal static IEnumerable<Dictionary<byte, string>> GetData()
{
Dictionary<byte, string> result = GetMyData(); //read from db
yield return result;
}
Надеюсь, что это поможет.