Подтвердить что ты не робот

Return return работает только для IEnumerable <T>?

Могу ли я использовать yield return, когда тип возврата является IGrouping<TKey, TElement> или IDictionary<TKey, TValue>?

4b9b3361

Ответ 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;
    }

Надеюсь, что это поможет.