逐行读取大文本文件并将其添加到对象列表中

时间:2018-03-19 20:33:14

标签: c# list object

文本文件有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);
                }
            }

有没有更有效的方法将它们添加到我的对象列表中?

2 个答案:

答案 0 :(得分:2)

你在循环的每次传递中迭代你的新集合(带const bar: React.StatelessComponent<Props> = (x: Props) => <div {...props} />; ),随着项目数量的增加导致一些非常讨厌的减速。

这是一种可能表现出更好性能特征的方法:

.All

答案 1 :(得分:0)

如果你能为每一行获得一个好的密钥,我建议使用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);
    }
}

注意我说,“如果”。通过哈希码和ToUpper()方法进行比较与StringComparison.CurrentCultureIgnoreCase不完全相同。有些文化的角色需要基于重音或类似的特殊处理。这可能是您遇到的问题,但可能不是......您必须查看数据并评估您的需求。 不要在评估上做空。

另请注意我对HashSet使用int。我可以把字符串放在那里。但是,我们最终在内存中为每一行存储两组数据:analysisDates集合中的原始行字符串和HashSet中的大写字符串。即使HashSet中的比较仅通过HashCode值完成,也会存储字符串的完整版本。这允许GC收集字符串的大写版本。由于已经出现OutOfMemoryException问题,我选择对可能的错误匹配进行点击以节省内存。