c# выходят из универсального ForEach та лямбда использования

Кто-либо знает, возможно ли выйти из универсального ForEach, который использует лямбду? например.

someList.ForEach(sl =>
  {
    if (sl.ToString() == "foo")
        break;

    // continue processing sl here
    // some processing code
  }
);

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

Большое спасибо.

8
задан FrustratedWithFormsDesigner 12 February 2010 в 03:09
поделиться

4 ответа

Конечно. Но сначала обратите внимание, что я не рекомендую этого делать; Я говорю, что у оператора последовательности не должно быть побочного эффекта, а у оператора должен быть побочный эффект. Если вы что-то делаете в этой лямбде ForEach, сделайте это оператором в теле цикла foreach, а не сделайте его похожим на оператор последовательности.

Тем не менее, вот что вы делаете. Сначала вы пишете себе ForEach, который работает с произвольными последовательностями, а не только со списками:

public static void ForEach<T>(this IEnumerable<T> sequence, Action<T> action)
{
    foreach(var item in sequence) action(item);
}

А теперь вы пишете свой разрыв так:

someList
    .TakeWhile(x=>x.ToString() != "foo")
    .ForEach(sl=>
    {/*your action here*/});
17
ответ дан 5 December 2019 в 06:09
поделиться

Из MSDN

Следующие правила применяются к области видимости переменной в лямбда-выражениях:

snip

Лямбда-выражение не может содержать оператор goto, оператор break или {{1 }} оператор continue, целью которого является вне тела или в теле содержащейся анонимной функции.

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

9
ответ дан 5 December 2019 в 06:09
поделиться

Как насчет этого?

        Enumerable.Range(1, 10)
        .Where(x => x % 2 != 0)
        .ToList()
        .ForEach(x => Console.WriteLine(x));
0
ответ дан 5 December 2019 в 06:09
поделиться

Одна неприятная ошибка json, которая укусила меня, произошла, когда я использовал сериализацию .Net в проекте WCF для создания ответов JSon для другой службы. Это был совершенно законный JSon согласно онлайн верификатор, но получатель не проглотил его.

Оказалось, что порядок содержания имел значение. Согласно JSon spec, заказ не должен иметь значения, но, видимо, потребитель на другом конце использовал какой-то пользовательский синтаксический анализатор, который захлебнулся, когда он не нашел определенное поле в верхней части. Сериализатор поместил содержимое в алфавитном порядке.

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

Пример:

[DataMember(Order = 1)] //<-- thank Zod this exists!
public List<Foo> MyFoos { get; set; }

помещает массив «MyFoos» в верхней части ответа JSon.

Примечание: если вы это сделаете, убедитесь, что каждому члену данных присвоен порядок, потому что члены данных без номера заказа по-прежнему будут плавать наверх.

-121--5044391-

Я должен перейти от варианта 1 или 2 (для меня этот вариант лучше). Модули связаны в DLL, поэтому они уже связаны. Изменить конфигурационный элемент - это тривиально, но создание инфраструктуры для чтения поможет вам еще больше.

Варианты 3 и 4 намного больше работы.

-121--3186022-

Предупреждение: код ниже не должен восприниматься всерьез и предоставляется только в развлекательных целях!

Вы можете «смоделировать» продолжение с ранним возвращением так:

Enumerable.Range(1, 20)
          .ForEach(n =>
                {
                    if (n == 10) return;
                    Console.WriteLine("This is not 10: {0}", n);
                });

Это говорит, что я думаю, что побочные эффекты в лямбде являются признаком того, что вы делаете это неправильно. Вместо этого используйте правильный foreach. Или что-то вроде TakeWhile, как уже любезно продемонстрировал Эрик.

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

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