Оператор yield в C# и итераторы (2024)

Сегодня речь пойдет про важный оператор языка C# — yield. Мы также рассмотрим тесно связанные с ним понятия контейнера, генератора и итератора. В материале много примеров кода, в частности подробно рассмотрено применение yield break и yield return.

Онлайн-курс Бізнес-аналіз. Basic Level від Hillel IT School.

В ході курсу студенти навчаться техніці збору і аналізу вимог, документуванню та управлінню документацією, управлінню ризиками та змінами, а також навчаться моделювати процеси і прототипуванню.

Приєднатися

Оператор yield в C# и итераторы (1)

Содержание статьи:

1. Введение

2. Примеры оператора yield (c# yield)

Онлайн-курс Бізнес-аналіз. Basic Level від Hillel IT School.

В ході курсу студенти навчаться техніці збору і аналізу вимог, документуванню та управлінню документацією, управлінню ризиками та змінами, а також навчаться моделювати процеси і прототипуванню.

Приєднатися

3. Именованный итератор и его примеры

4. Применение итератора

5. Заключение

Введение

Предположим, у вас есть контейнер, не имеет значения какой. Этот контейнер содержит некоторый набор элементов. Вам необходимо сослаться на определенное место в этом наборе элементов. Это нужно, например, чтобы затем от этой позиции можно было перейти вперед или назад, при этом выполнив какую-то инструкцию обработки (изменить или вставить элемент, удалить его и т.д.). Чтобы не приходилось писать алгоритмы специфические для каждого контейнера, и были придуманы универсальные итераторы.

Оператор yield — специальный оператор генерации блока итератора. Оператор yield генерирует специальный класс, который выступает в качестве итератора для нашей коллекции. Этот оператор сообщает нам и компилятору, что данное выражение — итератор. Задача итератора перемещаться между элементами коллекции и возвращать текущее значение в цикле.

Онлайн-курс "Product Manager PRO" від robot_dreams.

Опануйте повний життєвий цикл продукту, щоб розробляти й оптимізувати рішення, які задовольняють користувачів і приносять прибуток. Досвід і фідбек двох лекторів.

Детальніше про курс

Примеры оператора yield (c# yield)

Давайте подкрепим эту теорию практикой. Напишем код для вывода всех четных значений первых 20 чисел:

using System;namespace HL{ class Program { static void Main() { int[] a = new int[20]; a = func(2, 20); for (int i = 0; i < 20; i++) { Console.WriteLine(a[i]); } Console.Read(); } public static int[] func(int start, int number) { int[] _number = new int[number]; for (int i = 0; i<number; i++) { _number[i] = start + 2 * i; } return _number; } }}

Теперь воспользуемся оператором yield, чтобы упростить этот код, ускорить работу алгоритма и сократить объем используемой памяти:

using System;using System.Collections;using System.Linq;using System.Text;namespace demo2{ class Program { static void Main() { foreach (var item in func(2, 10)) { Console.WriteLine(item); } Console.Read(); } public static IEnumerable func(int start, int number) { for (int i = 1; i < number; i++) { yield return start + 2 * i; } } }}

Применение yield return возвращает каждый элемент коллекции по очереди путем применения оператора foreach или запроса LINQ. Каждая итерация цикла foreach вызывает метод итератора. При достижении в методе итератора оператора yield return возвращается выражение стоящее после него, а также сохраняется текущее расположение в коде. При следующем вызове функции итератора выполнение возобновляется с этого места.

В примере ниже оператор yield return расположен в цикле for. Каждая итерация оператора foreach создает вызов функции итератора getRange. При этом происходит переход к следующему выполнению оператора yield return, которое осуществляется во время следующей итерации цикла for. Тип возвращаемого значения метода итератора — System.Collections.IEnumerable. При вызове метода итератора возвращается перечисляемый объект, содержащий числа на заданном участке массива.

using System;namespace DesignPatterns.Iterator.Conceptual{ public class YieldExample { static void Main() { int[] arrayOfNumbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; foreach (int i in getRange(arrayOfNumbers, 3, 6)) { Console.Write("{0} ", i); } } public static System.Collections.Generic.IEnumerable<int> getRange(int[] numbers, int start, int end) { for (int i = start; i <= end; i++) { int result = numbers[i]; yield return result; } } // Отображение в консоли: 4 5 6 7 }}

Операторyield breakслужит для преждевременного завершения перебора элементов коллекции. Ниже приводим пример программы, которая прерывает итерацию после десяти элементов. В консоли выводится десять первых элементов коллекции символов.

using System;using System.Collections;class FstClass{ char ch = 'A'; // В процессе перебора возвращаются первые 13 символов public IEnumerator GetEnumerator() { for (int i = 0; i < 26; i++) { if (i == 13) yield break; // остановить итерацию yield return (char)(ch + i); } }}class ItrDemo3{ static void Main() { FstClass mc = new FstClass(); foreach (char ch in mc) Console.Write(ch + " "); Console.WriteLine(); }}

Именованный итератор и его примеры

Именованный итератор выглядит следующим образом:

public IEnumerable имя_итератора(набор_параметров) { // имя_итератора - определенное имя метода yield return obj;// obj — следующий объект, возвращаемый итератором}

Созданный именованный итератор можно применять, скажем, для управления циклом foreach. Именованные итераторы могут передавать аргументы итератору, который управляет алгоритмом перебора элементов в коллекции. Например, итератору можно вернуть значения пределов выборки элементов, возвращаемой из коллекции итератором.

Итог по применению оператора yield

Сводим все приведенные выше концепции воедино. Напишем максимально оптимальный код для вывода букв массива:

using System;using System.Collections;namespace abcd{ class Bukva { char ch = 'А'; int end; public Bukva(int end) { this.end = end; } public IEnumerator GetEnumerator() { for (int i = 0; i < this.end; i++) { if (i == 33) yield break; // Остановка итератора, как только заканчивается массив букв yield return (char)(ch + i); } } // Создание именованного итератора public IEnumerable imennovaniyItr(int begin, int end) { for (int i = begin; i <= end; i++) { yield return (char)(ch + i); } } } class Program { static void Main() { Console.Write("Какое количество символов показать? "); int i = int.Parse(Console.ReadLine()); Bukva lt = new Bukva(i); Console.WriteLine("\nДемонстрация букв: \n"); foreach (char c in lt) Console.Write(c + " "); Console.Write("\nВведите пределы\n\nMin: "); int j = int.Parse(Console.ReadLine()); Console.Write("Max: "); int y = int.Parse(Console.ReadLine()); Console.WriteLine("\nБуквы в указанном диапазоне: \n"); foreach (char c in lt.imennovaniyItr(j, y)) Console.Write(c + " "); Console.ReadLine(); } }}

Заключение

По данной теме настоятельно рекомендуем посмотреть хорошее видео — в нем автор подробно рассказывает что такое yield return в C#, как работает yield return и когда следует применять yield return:

Онлайн-курс "Створення fashion-бренду" від Skvot.

Пройдіть повний цикл створення фешн-бренду: від вивчення індустрії та розробки колекції — до піару, продажів та фінансів. Досвід та фідбек співзасновниці та дизайнерки бренду KSENIASCHNAIDER.

Про курс

Оператор yield в C# и итераторы (2024)
Top Articles
Angel Number 8888: Meanings, Symbolism, & Interpretations
The Power of Angel Number 8888 and What It Means for Your Life
Rosy Boa Snake — Turtle Bay
Express Pay Cspire
Mchoul Funeral Home Of Fishkill Inc. Services
Www.craigslist Virginia
Plus Portals Stscg
Fnv Turbo
Routing Number 041203824
More Apt To Complain Crossword
Best Cheap Action Camera
AB Solutions Portal | Login
Milk And Mocha GIFs | GIFDB.com
Cincinnati Bearcats roll to 66-13 win over Eastern Kentucky in season-opener
The Connecticut Daily Lottery Hub
Sarpian Cat
Inevitable Claymore Wow
Les Rainwater Auto Sales
Palm Springs Ca Craigslist
Craigslist Prescott Az Free Stuff
Daytonaskipthegames
The Old Way Showtimes Near Regency Theatres Granada Hills
Winco Employee Handbook 2022
Jeffers Funeral Home Obituaries Greeneville Tennessee
Greyson Alexander Thorn
Delectable Birthday Dyes
fft - Fast Fourier transform
Marilyn Seipt Obituary
Netspend Ssi Deposit Dates For 2022 November
Lawrence Ks Police Scanner
Ancestors The Humankind Odyssey Wikia
Slv Fed Routing Number
Cars And Trucks Facebook
Emerge Ortho Kronos
Kazwire
Craiglist Hollywood
Me Tv Quizzes
Great Clips Virginia Center Commons
Tgirls Philly
Divinity: Original Sin II - How to Use the Conjurer Class
Myrtle Beach Craigs List
20 Mr. Miyagi Inspirational Quotes For Wisdom
Backpage New York | massage in New York, New York
Worland Wy Directions
Hughie Francis Foley – Marinermath
Diario Las Americas Rentas Hialeah
Used Auto Parts in Houston 77013 | LKQ Pick Your Part
Gummy Bear Hoco Proposal
Uno Grade Scale
Psalm 46 New International Version
San Pedro Sula To Miami Google Flights
Www.card-Data.com/Comerica Prepaid Balance
Latest Posts
Article information

Author: Delena Feil

Last Updated:

Views: 6416

Rating: 4.4 / 5 (65 voted)

Reviews: 88% of readers found this page helpful

Author information

Name: Delena Feil

Birthday: 1998-08-29

Address: 747 Lubowitz Run, Sidmouth, HI 90646-5543

Phone: +99513241752844

Job: Design Supervisor

Hobby: Digital arts, Lacemaking, Air sports, Running, Scouting, Shooting, Puzzles

Introduction: My name is Delena Feil, I am a clean, splendid, calm, fancy, jolly, bright, faithful person who loves writing and wants to share my knowledge and understanding with you.