Могу ли я использовать 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;
}
Надеюсь, что это поможет.