如何在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
相关产品推荐
相关产品推荐

