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

如何高效实现1万行文本逐行读取并去重写入对象列表?

优化大文本文件读取与去重的性能方案

嘿,我来帮你解决这个性能问题~你的代码现在速度慢的核心原因,是每次判断行是否存在时都遍历了整个analysisDatas列表,这种O(n²)的时间复杂度在1万行数据的场景下会产生1亿次左右的比较操作,自然会拖慢速度。

核心优化思路:用HashSet替代列表遍历检查

我们可以用HashSet<string>来存储已经处理过的文本行,它的查找/添加操作都是O(1)的时间复杂度,能把整体性能提升到O(n)级别,这对大文件来说差异非常明显。另外要注意你需要忽略大小写,所以初始化HashSet时要指定对应的比较器。

修改后的代码示例

// 初始化一个不区分大小写的HashSet来存储已存在的文本
var existingTexts = new HashSet<string>(StringComparer.CurrentCultureIgnoreCase);
var analysisDatas = new List<AnalysisData>();

// 依然用File.ReadLines懒加载读取,避免一次性加载整个文件到内存
foreach (var line in File.ReadLines(ofd.FileName))
{
    // HashSet.Add()会返回false如果元素已存在,刚好符合我们的判断需求
    if (existingTexts.Add(line))
    {
        analysisDatas.Add(new AnalysisData { Text = line });
    }
}

额外的小优化点

  1. 过滤无效行:如果你的文件里有空行或空白行,可以提前过滤,减少不必要的操作:
    foreach (var line in File.ReadLines(ofd.FileName).Where(line => !string.IsNullOrWhiteSpace(line)))
    
  2. 关于StreamReader:File.ReadLines内部其实已经封装了高效的StreamReader懒加载逻辑,所以没必要换成手动的StreamReader,除非你需要更底层的编码控制之类的特殊需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:24:26