Могу ли я использовать yield return
, если тип возврата IGrouping<TKey, TElement>
или IDictionary<TKey, TValue>
?доходность доходности работает только для IEnumerable <T>?
ответ
yield return
работает ровно на 4-х случаях:
IEnumerable
IEnumerable<T>
IEnumerator
IEnumerator<T>
Это потому, что он должен построить государственную машину внутри; словарь (и т. д.) с этим невозможен. Вы можете, конечно, только return
подходящего типа.
Полезная статья здесь http://csharpindepth.com/articles/chapter6/iteratorblockimplementation.aspx, если вы хотите реализовать IEnumerable самостоятельно. – Rory
@Rory да, сама реализация - это массивная PITA, и я не могу придумать никаких «нормальных» причин, когда-либо сделавших это, теперь, когда существуют блоки итераторов. У меня есть несколько таких, но обычно это совместимо с проектами, которые нужно строить даже на компиляторах C# 1.2; не совсем «нормальный» сценарий. –
Согласен, хотя IGrouping может быть приятным, в некоторых случаях кажется более удобным использовать IEnumerable
Неа, просто IEnumerable :-)
Неверно; см. мой ответ ;-p –
Я не думаю, что так. В то время как точно не описывает это, способ, которым он сформулирован, подразумевает, что он может использоваться только тогда, когда тип возврата метода равен IEnumerable
или IEnumerable<T>
. Возможно, вы сможете написать класс, который реализует IGrouping
с учетом IEnumerable
(который будет возвращен из вашего метода с использованием yield return
), но это единственный вариант.
Спецификация языка говорит об этом вместо ... см. 8.18 в ECMA 334 –
Нет, поскольку блок итератора - это просто автомат, созданный от вашего имени компилятором. Эта функция позволяет вам «выдать» и элемент как часть последовательности.
Если тип возврата был отличным от IEnumerable<T>
(например, IDictionary
), то компилятор должен был бы генерировать методы для реализации этого интерфейса, и в этот момент это не имело бы большого смысла, потому что вы будете работать с коллекцией, а не с последовательность.
Вы могли бы вернуть IEnumerable<KeyValuePair<K,V>>
, который будет похож на словарь. Затем вы получите доход KeyValuePairs. Вы можете даже обернуть это другим методом, который создает словарь из возврата. Единственное, что первый метод не гарантировал, - это уникальность в ключах.
Затем вы теряете время доступа O (1) и должны циклически переключаться между каждым KVP, чтобы найти правильный ключ, принимая наихудшее время O (n). –
Ответ: Нет yield return
заявление может быть использовано только если тип возвращаемого значения IEnumerator
, IEnumerator<T>
, IEnumerable
или IEnumerable<T>
.
От §8.14 из C# 3.0 spec:
Оператор выхода используется в блоке итератора (§8.2) с получением значения для объекта нумератора (§10.14.4) или перечислимый объект (§10.14.5) итератора или сигнализировать о завершении итерации.
От §10.14.4:
объекта Перечислителя имеет следующие характеристики:
- Он реализует
IEnumerator
иIEnumerator<T>
, гдеT
типа выхода итератора.
[...]
От §10.14.5:
Перечислимый объект имеет следующие характеристики:
- Он реализует
IEnumerable
иIEnumerable<T>
, гдеT
является типом выход итератора.
[...]
Просто вызовите метод итератора и цепь ToDictionary
или GroupBy
после него, и у вас есть почти то же самое. Поместите это в однострочный метод обертки, если вам нужно так называть его из нескольких мест.
Как yield return
может использоваться с типами IEnumerator<T>
Почему бы не сделать что-нибудь подобное?
internal static IEnumerable<Dictionary<byte, string>> GetData()
{
Dictionary<byte, string> result = GetMyData(); //read from db
yield return result;
}
Надеюсь, это поможет.
Вы «получаете» список целых словарей, а не пар ключ-значение. – titol
- 1. Эмулировать доходность доходности для IObservable
- 2. доходность доходности от возврата
- 3. Как доходность доходности интерпретируется петлей foreach?
- 4. IEnumerable и доходность возврата
- 5. Лучший способ отлаживать доходность доходности, потребляемую во время сериализации?
- 6. Вложенный доход доходности с IEnumerable
- 7. Возврат дохода IEnumerable <IEnumerable <...>>
- 8. Должен ли IEnumerable использовать доходность, подлежащую отсрочке
- 9. IEnumerable и Recursion с возвратом доходности
- 10. Как доходность работает в C#
- 11. Autofac разрешить IEnumerable <TComponent> только для экземпляров только
- 12. Можно ли реализовать возврат доходности для функций IEnumerable в VB.NET?
- 13. рабочая модель возвращения доходности
- 14. Полезность доходности
- 15. Доходность продолжается?
- 16. Почему моя «доходность» не работает?
- 17. Выберите IEnumerable <object> из IEnumerable <IEnumerable <object>> LINQ
- 18. Группировка последовательных одинаковых элементов: IEnumerable <T> к IEnumerable <IEnumerable <T>>
- 19. Метод с возвратом доходности не выбрасывает исключение
- 20. IEnumerable <IEnumerable <int>> - не дублировать IEnumerable <int> s
- 21. Перегруженное использование доходности возврата
- 22. Как работает IEnumerable <T>
- 23. Как работает IEnumerable <T> .Reverse?
- 24. IEnumerable с возвратом доходности и VS Quickwatch аварии
- 25. Рекурсия и доходность возврата
- 26. Как я могу уменьшить IEnumerable <IEnumerable <Foo>> до IEnumerable <Foo>?
- 27. Доходность для нескольких блоков
- 28. IEnumerable <SelectListItem> - Условие для каждого элемента в IEnumerable
- 29. Правильный способ проверить, является ли IEnumerable <T> ключевым словом доходности
- 30. Mapper.Map <Task <IEnumerable <Address>>, Task <IEnumerable <AddressView>>()
Возможный дубликат [Некоторая помощь в понимании «выход»] (http://stackoverflow.com/questions/317462/some-help-understanding-yield) – nawfal