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

Когда использовать Доход?

Когда я должен использовать возвращаемый доход и когда я должен использовать возврат только?

4b9b3361

Ответ 1

Конструкция yield используется для создания итератора, который может последовательно создавать несколько значений:

IEnumerable<int> three_numbers() {
    yield return 1;
    yield return 2;
    yield return 3;
}
...
foreach (var i in three_numbers()) {
    // i becomes 1, 2 and 3, in turn.
}

Ответ 2

Используйте выход, когда вы возвращаете перечислимое значение, и у вас нет всех результатов в этой точке.

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

Ответ 3

Выход для итераторов.

Он позволяет обрабатывать список в маленьких ласточках, что хорошо для больших списков.

Волшебная вещь о доходе - это то, что она запоминает, где вы находитесь между вызовами.

Если вы не итерируете, вам не нужен выход.

Ответ 4

Ключевое слово yield невероятно мощное. Он в основном позволяет быстро возвращать объекты IEnumerable и IEnumerator без явно их кодирования.

Рассмотрим сценарий, в котором вы хотите вернуть пересечение двух объектов IEnumerable. Вот как вы это сделаете, используя ключевое слово yield.

public static class Program
{
  public static void Main()
  {
    IEnumerable<object> lhs = new List<int> { 1, 2, 3, 4, 5 };
    IEnumerable<object> rhs = new List<int> { 3, 4, 5, 6, 7 };
    foreach (object item in IntersectExample.Intersect(lhs, rhs))
    {
      Console.WriteLine(item);
      break;
    }
  }
}

public static class IntersectExample
{
  public static IEnumerable<object> Intersect(IEnumerable<object> lhs, IEnumerable<object> rhs)
  {
    var hashset = new HashSet<object>();
    foreach (object item in lhs)
    {
      if (!hashset.Contains(item))
      {
        hashset.Add(item);
      }
    }
    foreach (object item in rhs)
    {
      if (hashset.Contains(item))
      {
        yield return item;
      }
    }
  }
}

Трудно это оценить, пока вы не поймете, что происходит. Обычно, когда вы пересекаете два набора, вы завершаете всю операцию, прежде чем возвращать результат вызывающему. Средством выполнения операции является O(m + n), где m и n - это размеры пересекаемых коллекций, независимо от того, что вы делаете с результатом впоследствии. Но в моем примере я просто хотел отбирать первый элемент из результата. Использование IEnumerable, созданное ключевым словом yield, позволяет легко отложить часть обработки до тех пор, пока она не понадобится. Мой пример работает в O(m). Альтернативой является кодирование IEnumerable и сохранение состояния в нем вручную. Сила ключевого слова yield заключается в том, что он создает для вас этот конечный автомат.

Ответ 5

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

Ответ 6

Здесь объясняется:

Справочник по языку С#
yield (ссылка С#)

Вызываемый метод возвращает каждое отдельное значение, чтобы вызывающий вызывал его.

Это означает, что вам нужно будет использовать доход, если вы хотите получить все возможные результаты, возвращенные итерацией.