[英]Read Large Text File Line by Line and add them into List of Objects
文本文件有10000行。 我已經嘗試過使用File.ReadLine
和StreamReader
但這似乎很慢。 這是我的代碼
foreach (var line in File.ReadLines(ofd.FileName))
{
if (analysisDatas.All(analysisData =>!string.Equals(analysisData.Text, line, StringComparison.CurrentCultureIgnoreCase)))
{
var item = new AnalysisData { Text = line };
analysisDatas.Add(item);
}
}
有沒有更有效的方法將它們添加到我的對象列表中?
您在循環的每一遍都在迭代新集合(使用.All
),這會導致隨着項目數量的增加而出現一些令人討厭的減速。
這是一種可能顯示更好的性能特征的方法:
File
.ReadLines(filePath)
.Distinct(StringComparer.CurrentCultureIgnoreCase)
.Select(line => new AnalysisData { Text = line })
.ToList()
如果您可以為每行找到一個好的密鑰,建議您使用HashSet<T>
而不是All()
來檢查每行。 一個簡單/簡單的例子可能看起來像這樣:
var lineKeys = new HashSet<int>();
foreach (var line in File.ReadLines(ofd.FileName))
{
int hash = line.ToUpper().GetHashCode();
if (linesKeys.Add(hash) || analysisDatas.All(analysisData =>!string.Equals(analysisData.Text, line, StringComparison.CurrentCultureIgnoreCase)))
{
var item = new AnalysisData { Text = line };
analysisDatas.Add(item);
}
}
請注意,我說“如果”。 通過hashcode和ToUpper()
方法進行的比較與StringComparison.CurrentCultureIgnoreCase
並不完全相同。 有些文化的字符需要根據口音或類似字符進行特殊處理。 在您所處的情況下,這可能是個問題,但可能不是...您必須查看數據並評估您的需求。 不要在評估上做空。
還要注意我對HashSet使用int
。 我可以把繩子放在那里。 但是,最后我們為每一行在內存中存儲了兩組數據: analysisDates
集合中的原始行字符串和HashSet
的大寫字符串。 即使僅通過HashCode值完成HashSet中的比較,也將存儲字符串的完整版本。 這使GC可以收集字符串的大寫版本。 由於已經存在OutOfMemoryException問題,因此我選擇對潛在的不匹配項進行重擊以節省內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.