文本文件有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);
}
}
有没有更有效的方法将它们添加到我的对象列表中?
答案 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问题,我选择对可能的错误匹配进行点击以节省内存。