У меня есть несколько циклов, после завершения которых необходимо запустить функцию обновления, за исключением, конечно, случаев, когда коллекция пуста.
Это приводит к появлению циклов, подобных примеру ниже.
Я знаю, что оператор if может быть только при вызове Update()
, но мне было интересно, есть ли такая конструкция, как, наконец, которая работает с циклами в C#?
if (myList.Count > 0)
{
foreach (Item it in myList)
{
it.Delete();
}
myList.Update();
}
Я представляю себе что-то вроде этого:
foreach (Item it in myList)
{
it.Delete();
}
finally
{
myList.Update();
}
Спасибо за предложение, добавил пример. К сожалению, функция обновления находится вне моего контроля, иначе это было бы гораздо быстрее и проще.
Чем добавление блокаfinally после цикла отличается от просто наличия вложенного блока после цикла. В цикле нет ничего, что могло бы помешать выполнению любых последующих строк!
После редактирования: похоже, что это будет противоположно проверке «IsEmpty»: «наконец» в try/catch должно выполняться независимо от исключения. Таким образом, эквивалентом здесь будет обновление независимо от количества элементов? Кажется, это не то, чего ты хочешь?
Если вас беспокоит дублирование кода, я бы просто создал метод расширения, который инкапсулирует это.
Просто прикрепите if к призыву обновить! Если myList
пусто, foreach будет «пропущен». Простой
^^ dotnetfiddle.net/NYgpNc или даже более общий: dotnetfiddle.net/Kctwpa
@ Филдор, ты на 100% прав, то, о чем я думал, определенно НЕ было окончательным заявлением. К счастью, пример, который вы просили, прояснил, о чем я на самом деле спрашивал.
Вы можете написать метод расширения:
public static void IterateWithFinalAction<T>(this ICollection<T> collection, Action<T> foreachAction, Action finalAction)
{
if (collection.Count == 0)
{
return;
}
foreach(var item in collection)
{
foreachAction.Invoke(item);
}
finalAction.Invoke();
}
Использование
myList.IterateWithFinalAction(x => x.Delete(), () => myList.Update());
Онлайн-демо: https://dotnetfiddle.net/Q0wcyp
Я бы изменил это, если проверить, чтобы вы могли просто заранее выйти из пустой коллекции и избавить себя от одного уровня отступов.
«если есть такая конструкция, как «finally», которая работает с циклами в C#» — можете ли вы написать, как она должна выглядеть? Кстати, я бы отказался от этого
if
и добавил внутри чекUpdate()
, чтобы вернуться раньше при пустой коллекции.