如何使用HashSet从文本文件中删除重复项? (C#)

时间:2018-11-15 02:11:54

标签: c#

因此,我决定创建一个可以完成很多事情的程序。作为该程序的一部分,有一个名为“文本工具”的部分,该部分获取文本文件(通过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);


    }

2 个答案:

答案 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);
        }
    }
}