因此,我决定创建一个可以完成很多事情的程序。作为该程序的一部分,有一个名为“文本工具”的部分,该部分获取文本文件(通过1个按钮),然后具有执行其他功能的其他按钮,例如从文件中删除空格和空行,删除重复项以及删除匹配的行特定模式,例如123或abc。
我能够使用foreach循环导入文件并打印列表,我相信我的做法正确,但是我需要删除重复项。由于该线程表示它是最简单,最快的方法(我的文件将包含百万行),因此我决定使用HashSet。
问题是我无法弄清楚自己在做什么,我为按钮单击提供了事件处理程序,在内存中创建了一个字符串列表,遍历文件的每一行(添加将其添加到列表中),然后创建另一个列表并将其设置为列表的HashSet。 (很抱歉,如果不知所措,由于某种原因,它将无法正常工作。)
我查看了每个与此类似的stackoverflow问题,但找不到任何解决方案。通常,我也没有对HashSet进行过研究。
到目前为止,这是我的代码:
private void btnClearDuplicates_Copy_Click(object sender, RoutedEventArgs e)
{
List<string> list = new List<string>();
foreach (string line in File.ReadLines(FilePath, Encoding.UTF8))
{
list.Add(line);
}
var DuplicatesRemoved = new HashSet<String>(list);
}
答案 0 :(得分:2)
具体说明您的问题,并获得我的最后3分。
var lines = File.ReadAllLines("somepath");
var hashSet = new HashSet<string>(lines);
File.WriteAllLines("somepath", hashSet.ToList());
请注意,还有其他方法,也许还有更多执行方法。它取决于重复项的数量和文件的大小
答案 1 :(得分:0)
如果可能的话,最好将文件作为流处理。我什至不称其为优化,而宁愿称其为“不浪费”。如果可以使用流方法,则视情况而定,ReadAllLines方法介于好坏之间。保持线条顺序也是一个好主意。 HashSet通常不保留顺序,如果将所有内容存储到其中并读取它,则可以将其洗牌。
using (var outFile = new StreamWriter(outFilePath))
{
HashSet<string> seen = new HashSet<string>();
foreach (string line in File.ReadLines(FilePath, Encoding.UTF8))
{
if (seen.Add(line))
{
outFile.WriteLine(line);
}
}
}