Урожай полезен, потому что экономит ваше пространство. Большинство оптимизаций в программировании сводятся к компромиссу между пространством (диск, память, сеть) и обработкой. Yield как программная конструкция позволяет выполнять итерацию по коллекции много раз подряд без необходимости создавать отдельную копию коллекции для каждой итерации.
рассмотрим этот пример:
static IEnumerable<Person> GetAllPeople()
{
return new List<Person>()
{
new Person() { Name = "George", Surname = "Bush", City = "Washington" },
new Person() { Name = "Abraham", Surname = "Lincoln", City = "Washington" },
new Person() { Name = "Joe", Surname = "Average", City = "New York" }
};
}
static IEnumerable<Person> GetPeopleFrom(this IEnumerable<Person> people, string where)
{
foreach (var person in people)
{
if (person.City == where) yield return person;
}
yield break;
}
static IEnumerable<Person> GetPeopleWithInitial(this IEnumerable<Person> people, string initial)
{
foreach (var person in people)
{
if (person.Name.StartsWith(initial)) yield return person;
}
yield break;
}
static void Main(string[] args)
{
var people = GetAllPeople();
foreach (var p in people.GetPeopleFrom("Washington"))
{
// do something with washingtonites
}
foreach (var p in people.GetPeopleWithInitial("G"))
{
// do something with people with initial G
}
foreach (var p in people.GetPeopleWithInitial("P").GetPeopleFrom("New York"))
{
// etc
}
}
(Очевидно, что вам не обязательно использовать yield с методами расширения, это просто создает мощную парадигму для размышлений о данных.)
Как видите, если у вас много этих "фильтровальных" методов (но это может быть любой метод, который работает со списком людей), вы можете связать многие из них вместе, не требуя дополнительного места для хранения на каждом этапе. . Это один из способов поднять уровень языка программирования (C #), чтобы лучше выразить ваши решения.
Первый побочный эффект yield заключается в том, что выполнение логики фильтрации задерживается до тех пор, пока она вам не понадобится. Поэтому, если вы создаете переменную типа IEnumerable ‹> (с доходностью), но никогда не выполняете итерацию по ней, вы никогда не выполняете логику и не потребляете пространство, что является мощной и бесплатной оптимизацией.
Другой побочный эффект заключается в том, что yield работает с самым низким общим интерфейсом коллекции (IEnumerable ‹>), что позволяет создавать библиотечный код с широким применением.
person
Pieter Breed
schedule
25.11.2008