簡體   English   中英

逐行讀取大文本文件並將其添加到對象列表中

[英]Read Large Text File Line by Line and add them into List of Objects

文本文件有10000行。 我已經嘗試過使用File.ReadLineStreamReader但這似乎很慢。 這是我的代碼

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM