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

C#多层嵌套foreach循环迭代时如何计算0-100的进度百分比

多层foreach循环进度百分比计算方案

核心逻辑是先明确最小工作单元的总数量,每完成一个单元累加计数,再换算为0-100的百分比值,该方式计算的进度是线性均匀的,用户感知效果最好。

完整实现代码

1. 提前统计总数量(推荐方案)

如果可以引入Linq,总统计代码非常简洁:

using System.Linq;

// 统计所有待处理的MyStruct总数量
int totalCount = allDocuments.Sum(ad => ad.Value.Sum(categoryDocs => categoryDocs.Value.Count));
int processedCount = 0;
int progress = 0;

// 处理总数量为0的边界情况,避免除以零报错
if (totalCount == 0)
{
    progress = 100;
    // 无数据时的自定义处理逻辑
}
else
{
    foreach (KeyValuePair<long, Dictionary<long, List<MyStruct>>> ad in allDocuments)
    {
        Dictionary<long, List<MyStruct>> categoriesDocs = ad.Value;

        foreach (KeyValuePair<long, List<MyStruct>> categoryDocs in categoriesDocs)
        {
            List<MyStruct> docs = categoryDocs.Value;

            foreach(MyStruct doc in docs)
            {
                processedCount++;
                // 换算为百分比,使用四舍五入取整符合常规展示习惯
                progress = (int)Math.Round((double)processedCount / totalCount * 100);

                //... 业务逻辑代码 ....
            }
        }
    }
}

如果项目不支持Linq,可以手动遍历统计总数量:

int totalCount = 0;
foreach (var ad in allDocuments)
{
    foreach (var categoryDocs in ad.Value)
    {
        totalCount += categoryDocs.Value.Count;
    }
}

2. 无预统计的权重估算方案(仅适合低要求场景)

如果你的集合体量极大,预统计总数量的开销不可接受,可以采用分层权重分配的方式估算进度,缺陷是进度增长不均匀,可能出现跳变:

int progress = 0;
int adCount = allDocuments.Count;
int adIndex = 0;
foreach (var ad in allDocuments)
{
    adIndex++;
    var categories = ad.Value;
    int categoryCount = categories.Count;
    int categoryIndex = 0;
    foreach (var category in categories)
    {
        categoryIndex++;
        var docs = category.Value;
        int docCount = docs.Count;
        int docIndex = 0;
        foreach (var doc in docs)
        {
            docIndex++;
            // 三层各占1/3权重,也可根据实际业务调整权重比例
            double adWeight = (double)adIndex / adCount * 100 * 0.33;
            double categoryWeight = (double)categoryIndex / categoryCount * 100 * 0.33;
            double docWeight = (double)docIndex / docCount * 100 * 0.34;
            progress = (int)Math.Round(adWeight + categoryWeight + docWeight);

            //... 业务逻辑代码 ....
        }
    }
}

内容的提问来源于stack exchange,提问作者Salvatore Cassano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 02:57:05