C#中是否存在类似finally的循环后置执行构造?
C#循环后仅在集合非空时执行Update的方案
首先明确:C#里没有专门针对循环的、能满足你需求的类似finally的构造。你期望的foreach后直接加finally的写法不可行——因为标准的finally是和try块绑定的,不管try里的循环有没有实际执行(比如集合为空时),finally代码都会运行,这就会导致集合为空时也执行Update(),不符合你的要求。
针对你的需求,推荐几种实用方案:
方案1:保留现有判断写法
这是最直接清晰的写法,可读性强,逻辑一目了然:
if (myList.Count > 0) { foreach (Item it in myList) { it.Delete(); } myList.Update(); }
方案2:使用执行标记变量
如果你的集合是延迟执行的LINQ查询(提前调用Count会触发额外遍历),可以用一个标记变量记录循环是否实际执行过,避免两次遍历:
bool loopRan = false; foreach (Item it in myList) { loopRan = true; it.Delete(); } if (loopRan) { myList.Update(); }
方案3:封装扩展方法复用逻辑
如果多个地方都需要这种“循环执行操作后仅在循环运行过时触发更新”的逻辑,可以封装成扩展方法,简化调用:
public static void ForEachThenUpdate<T>(this IEnumerable<T> source, Action<T> itemAction, Action updateAction) { bool executed = false; foreach (var item in source) { executed = true; itemAction(item); } if (executed) { updateAction(); } }
调用时只需一行代码:
myList.ForEachThenUpdate(it => it.Delete(), () => myList.Update());
内容的提问来源于stack exchange,提问作者Jeppe
相关产品推荐
相关产品推荐

