如何高效实现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 }); } }
额外的小优化点
- 过滤无效行:如果你的文件里有空行或空白行,可以提前过滤,减少不必要的操作:
foreach (var line in File.ReadLines(ofd.FileName).Where(line => !string.IsNullOrWhiteSpace(line))) - 关于StreamReader:
File.ReadLines内部其实已经封装了高效的StreamReader懒加载逻辑,所以没必要换成手动的StreamReader,除非你需要更底层的编码控制之类的特殊需求。
内容的提问来源于stack exchange,提问作者userrrrrrr
相关产品推荐
相关产品推荐

