You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:59:54