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

如何在C#中高效搜索对象列表?

大列表快速搜索实现方案

问题背景

现有筛选代码示例:

SearchList2 = SearchList1.Where(item => item.name.StartsWith(searchValue)).ToList();

需要基于此实现对超大元素量SearchList1的快速搜索,并将结果存入新列表。

优化方案

1. 预构建前缀索引(适配高频前缀搜索)

如果频繁执行StartsWith这类前缀匹配,提前构建有序索引能大幅缩短搜索时间:

// 初始化前缀索引(仅执行一次)
var nameSortedIndex = new SortedList<string, List<YourItemType>>();
foreach (var item in SearchList1)
{
    if (!nameSortedIndex.ContainsKey(item.name))
    {
        nameSortedIndex[item.name] = new List<YourItemType>();
    }
    nameSortedIndex[item.name].Add(item);
}

// 快速前缀搜索
var results = new List<YourItemType>();
foreach (var key in nameSortedIndex.Keys)
{
    if (key.StartsWith(searchValue))
    {
        results.AddRange(nameSortedIndex[key]);
    }
    // 利用SortedList有序特性,超出前缀范围时提前终止循环
    if (string.Compare(key, searchValue + char.MaxValue) > 0)
    {
        break;
    }
}
SearchList2 = results;

2. 并行搜索(适配百万级以上元素)

当列表规模极大且搜索逻辑无线程安全风险时,用并行LINQ利用多核CPU加速:

SearchList2 = SearchList1.AsParallel()
                         .Where(item => item.name.StartsWith(searchValue))
                         .ToList();

注意:并行搜索会占用更多CPU资源,仅在元素量真的足够大时才有明显收益。

3. 哈希表分组(适配固定前缀搜索)

如果搜索的前缀是固定的几个值,提前按前缀分组存入哈希表:

// 预先按目标前缀分组(示例按首字母分组)
var prefixGroups = SearchList1.GroupBy(item => item.name.Substring(0, Math.Min(searchValue.Length, item.name.Length)))
                              .ToDictionary(g => g.Key, g => g.ToList());

// 直接读取对应前缀的结果
SearchList2 = prefixGroups.TryGetValue(searchValue, out var group) ? group : new List<YourItemType>();

内容的提问来源于stack exchange,提问作者Haneen Al-fakhry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:01:03