Что такое реальные применения урожая?

Просто измените

system('unzip $master.zip');

На это

system('unzip ' . $master . '.zip');

или этот

system("unzip {$master}.zip");

13
задан juan 22 September 2008 в 14:26
поделиться

6 ответов

Я понимаю это старый вопрос (до Джона Скита?), но я сам обдумывал этот вопрос совсем недавно. К сожалению, в текущих ответах здесь (на мой взгляд) не упоминается наиболее очевидное преимущество оператора yield.

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

Например, допустим, у вас есть запрос к базе данных, который возвращает 1 миллион строк. Вы можете получить все строки с помощью DataReader и сохранить их в списке, поэтому для этого потребуется list_size * row_size байтов памяти.

Или вы можете использовать оператор yield для создания Iterator и хранить в памяти только одну строку за раз. Фактически это дает вам возможность предоставлять возможность «потоковой передачи» больших наборов данных.

Более того, в коде, который использует Iterator, вы используете простой цикл foreach и можете решить выйти из цикла по мере необходимости. Если вы прерываете работу раньше, вы не вызываете принудительное извлечение всего набора данных, когда вам нужны только первые 5 строк (например).

Относительно:

Ideally some problem that cannot be solved some other way

Оператор yield не дает вам ничего, чего вы не могли бы вы можете использовать собственную реализацию итератора, но это избавляет вас от необходимости писать часто сложный код. Есть очень мало проблем (если таковые имеются), которые нельзя решить более чем одним способом.

Вот несколько недавних вопросов и ответов, которые предоставляют более подробную информацию:

Добавлено ключевое слово Yield?

Можно ли использовать yield вне LINQ?

11
ответ дан 1 December 2019 в 22:41
поделиться

на самом деле я использую его не традиционным способом на моем сайте IdeaPipe

public override IEnumerator<T> GetEnumerator()
{
    // goes through the collection and only returns the ones that are visible for the current user
    // this is done at this level instead of the display level so that ideas do not bleed through
    // on services
    foreach (T idea in InternalCollection)
        if (idea.IsViewingAuthorized)
            yield return idea;
}

так в основном, это проверяет, если просмотр идеи в настоящее время авторизовывается и если это - это, возвращает идею. Если это не, это просто пропускается. Это позволяет мне кэшировать Идеи, но все еще отображать идеи пользователям, которые авторизовываются. Еще я имел бы к ре, вытягивают их каждый раз на основе полномочий, когда они только повторно оцениваются каждый 1 час.

5
ответ дан 1 December 2019 в 22:41
поделиться

Одно интересное использование как механизм для асинхронного программирования особенно для задач, которые делают несколько шагов и требуют того же набора данных на каждом шаге. Двумя примерами этого была бы часть 2 AysncEnumerator Части 1 и Jeffery Richters. Время выполнения Параллелизма и Координации (CCR) также использует эту технику Итераторы CCR .

2
ответ дан 1 December 2019 в 22:41
поделиться

Используя урожай может предотвратить downcasting к конкретному типу. Это удобно, чтобы гарантировать, что потребитель набора не управляет им.

1
ответ дан 1 December 2019 в 22:41
поделиться

Другое хорошее использование для урожая должно выполнить функцию на элементах IEnumerable и возвратить результат другого типа, например:

public delegate T SomeDelegate(K obj);

public IEnumerable<T> DoActionOnList(IEnumerable<K> list, SomeDelegate action)
{
    foreach (var i in list)
        yield return action(i);
}
1
ответ дан 1 December 2019 в 22:41
поделиться

Операторы LINQ на Счетном классе реализованы как итераторы, которые создаются с оператором урожая. Это позволяет Вам цепочечным операциям как Выбор () и Где (), ничего на самом деле не перечисляя, пока Вы на самом деле не используете перечислитель в цикле, обычно при помощи оператор foreach . Кроме того, так как только одно значение вычисляется при вызове IEnumerator. MoveNext (), если Вы решаете остановить середину набора, Вы сохраните хит производительности вычисления всех результатов.

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

1
ответ дан 1 December 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: