.NET:合并元组列表中重复项的失败产品字典
解决方案
核心思路是用**字典(Dictionary)**替代List来存储检查结果,利用字典的键唯一性快速定位重复的IProductChecker<TModel>实例,既避免了List遍历的低效查找,又能方便合并对应的失败产品字典。
具体实现代码
// 改用字典存储,键为IProductChecker实例,值为对应的失败产品字典 var failed = new Dictionary<IProductChecker<TModel>, IDictionary<int, string[]>>(); foreach (var ids in batches) { var batch = Check(names, ids.ToArray()); // 返回List<(IProductChecker<TModel> checker, IDictionary<int, string[]> failedProducts)> foreach (var (checker, batchFailedProducts) in batch) { // 检查当前checker是否已存在于字典中 if (failed.TryGetValue(checker, out var existingFailedProducts)) { // 合并失败产品:将批次中的条目添加到已有字典 foreach (var (productId, errors) in batchFailedProducts) { if (existingFailedProducts.ContainsKey(productId)) { // 同一产品ID的错误数组合并,可根据需求改为覆盖/去重 existingFailedProducts[productId] = existingFailedProducts[productId].Concat(errors).ToArray(); } else { existingFailedProducts.Add(productId, errors); } } } else { // 不存在则新增条目,创建字典副本避免后续修改影响存储数据 failed.Add(checker, new Dictionary<int, string[]>(batchFailedProducts)); } } } // 若最终需要转回原List格式,可执行以下代码 var failedList = failed.Select(kv => (name: kv.Key, failedProducts: kv.Value)).ToList();
关键说明
- 用
Dictionary<IProductChecker<TModel>, ...>替代List,利用键的唯一性快速定位重复实例,查找效率从O(n)提升至O(1),批量处理时性能更优。 - 合并字典时,需根据业务需求调整错误信息处理逻辑:示例为合并同一产品ID的错误数组,你也可选择覆盖、去重等策略。
- 新增条目时创建字典副本,避免后续对原批次字典的修改影响已存储的数据(若
Check方法返回可修改字典)。
内容的提问来源于stack exchange,提问作者user122222
相关产品推荐
相关产品推荐

