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

如何在双层嵌套字典中通过唯一二级键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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 17:06:04