2016-10-10 13 views
1

Существует yield return, чтобы вернуть следующий элемент в коллекции, а затем yield break, чтобы завершить итерацию. Есть ли вид yield continue, чтобы сообщить контроллеру цикла, чтобы перейти к следующему элементу?Доходность продолжается?

Вот что я пытаюсь достичь, хотя это явно не строит:

static IEnumerable<int> YieldTest() 
{ 
    yield return 1; 
    yield return 2; 
    yield continue; 
    yield return 4; 
} 
+3

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

+4

Что вы ожидаете после того, как «yield continue»? Что получит абонент? Почему бы просто не пойти с 'yield return 4;' after '2'? – BartoszKP

+1

@BartoszKP Это * просто пример *. Я также попытался просто использовать continue в моем методе, но он не строится, потому что он недействителен. – oscilatingcretin

ответ

9

Там нет необходимости иметь отдельный yield continue заявление. Просто используйте continue или любой другой условный оператор, чтобы пропустить элемент по мере необходимости в вашем алгоритме перечисления.

Алгоритм перечисления, который использует yield, внутренне преобразован в конечный автомат компилятором, который может быть вызван несколько раз. Точка состоит в том, что она генерирует выход, эффективно останавливая/останавливая конечный автомат в том месте, где оно используется. Эффект возможного yield continue был бы вовсе не в отношении поведения конечного автомата. Следовательно, это не нужно.

Пример:

static IEnumerable<int> YieldTest() 
{ 
    for (int value = 1; value <= 4; value++) 
    { 
     if (value == 3) continue; // alternatively use if (value != 3) { … } 
     yield return value; 
    } 
} 
+0

@Downvoter Не стесняйтесь комментировать, что вы делаете неправильно с моим ответом, чтобы его можно было улучшить. –

0

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

static IEnumerable<int?> YieldTest() 
{ 
    yield return 1; 
    yield return 2; 
    yield return null; 
    yield return 4; 
}