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

System.Collections.Generic.List或同命名空间类是否支持索引加速查找?

内存集合中的“索引”替代方案

你当前的代码每次调用products.Where(o => o.Id == part.ProductId).FirstOrDefault()时,都会遍历整个List<Product>,时间复杂度为O(n),当数据量较大或循环次数较多时,效率会很低。在.NET的System.Collections.Generic命名空间中,有专门的集合类可以实现类似数据库索引的快速查找效果:

1. 首选:Dictionary<TKey, TValue>

这是最常用的内存“索引”方案,基于哈希表实现,查找操作的时间复杂度为O(1)。你可以先将List<Product>转换成以Product.Id为键的字典:

List<Product> products = Db.GetAllProducts(database);
// 假设Product.Id是int类型,根据实际类型调整键的类型
var productDictionary = products.ToDictionary(p => p.Id);

之后在循环中用TryGetValue方法快速判断是否存在对应ID的产品:

foreach (var part in ListOfParts)
{
    if (part.ProductId != null)
    {
        if (!productDictionary.TryGetValue(part.ProductId.Value, out _))
        {
            // 原来的逻辑代码
        }
    }
}

注意:ToDictionary要求键必须唯一,如果你的Product.Id可能存在重复值(这种情况在主键场景中很少见),可以改用下面的Lookup类。

2. 处理重复键:Lookup<TKey, TElement>

Lookup是只读的多值映射集合,同样基于哈希表实现,适合一个键对应多个值的场景:

var productLookup = products.ToLookup(p => p.Id);

判断是否存在对应ID时,直接使用Contains方法:

if (!productLookup.Contains(part.ProductId.Value))
{
    // 原来的逻辑代码
}

3. 有序场景:SortedDictionary<TKey, TValue> 或 SortedList<TKey, TValue>

如果需要保持产品的排序顺序,同时获得比List更快的查找速度,可以使用这两个有序集合,它们的查找时间复杂度为O(log n):

// SortedDictionary内部是红黑树实现,适合频繁插入/删除的场景
var sortedProductDict = new SortedDictionary<int, Product>(products.ToDictionary(p => p.Id));

// SortedList内部是数组实现,内存占用更小,适合静态数据场景
var sortedProductList = new SortedList<int, Product>(products.ToDictionary(p => p.Id));

查找时同样可以用TryGetValue方法快速判断。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 19:07:04