如何在双层嵌套字典中通过唯一二级键productId查询对应Task列表
双层嵌套字典按productId查询优化方案
核心单步查询实现
利用LINQ的SelectMany将嵌套字典的内层键值对扁平化为一维序列,直接匹配目标productId即可一次查询得到结果,代码如下:
return base.Values.SelectMany(innerDict => innerDict) .Single(kv => kv.Key == productId) .Value;
逻辑说明
SelectMany会遍历所有外层字典对应的内层字典,把所有(productId, List<Task>)键值对展开为一个连续的序列,之后直接匹配Key等于目标值的条目,取Value属性即可得到结果,完全符合单步查询逻辑,且利用了productId全局唯一的前提条件,不会出现多匹配异常。
异常兼容版本
如果需要处理productId不存在的场景,避免抛出InvalidOperationException,可以修改为以下写法:
// 找不到时返回默认值(null) return base.Values.SelectMany(innerDict => innerDict) .SingleOrDefault(kv => kv.Key == productId) .Value ?? default; // 找不到时返回空列表,避免空引用风险 return base.Values.SelectMany(innerDict => innerDict) .SingleOrDefault(kv => kv.Key == productId) .Value ?? Enumerable.Empty<Task>().ToList();
高频查询场景优化
如果你需要频繁执行该查询操作,建议提前构建全局productId映射缓存,将查询时间复杂度从O(n)降到O(1):
// 初始化时仅构建一次的全局映射表 private readonly Dictionary<string, List<Task>> _productTaskCache = base.Values.SelectMany(innerDict => innerDict) .ToDictionary(kv => kv.Key, kv => kv.Value); // 后续查询直接走索引 public List<Task> GetTasksByProductId(string productId) { return _productTaskCache.TryGetValue(productId, out var tasks) ? tasks : new List<Task>(); }
内容的提问来源于stack exchange,提问作者Froschkoenig84
相关产品推荐
相关产品推荐

