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
相关产品推荐
相关产品推荐

