【问题标题】:How do I use HashSet to remove duplicates from a text file? (C#)如何使用 HashSet 从文本文件中删除重复项? (C#)
【发布时间】:2018-11-15 02:11:54
【问题描述】:

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


    }

【问题讨论】:

  • 无法从 'System.Collections.Generic.List' 转换为 'System.Collections.Generic.IEqualityComparer'
  • Respectfully I didn't open the question to ask for links that I've already found 如果你要狡猾,至少提供你已经阅读的链接。我们不是读心术的人。 :)
  • 我建议完全停止使用List&lt;string&gt;,然后使用HashSet&lt;string&gt;。您不需要List。请注意,理论上HashSet 可以以与文件中不同的顺序返回数据(当前实现不会,但将来可以)。

标签: c#


【解决方案1】:

具体到您的问题,并获得我的最后 3 分。

var lines = File.ReadAllLines("somepath");
var hashSet = new HashSet<string>(lines);
File.WriteAllLines("somepath", hashSet.ToList());

请注意,还有其他方法,也许是更高效的方法。这取决于重复的数量和文件的大小

【讨论】:

  • 两件事:1)这会将文件写入与它们相同的路径吗? (只是为了澄清)2)我使用上面的 ReadLines 是因为人们说它更快,使用具有数百万行的文件是否会对两种方法之间的性能产生任何影响?
  • @CollegeAmeteur 百万行是一个完全不同的优化,可能涉及到几件事来使其比ReadAllLinesReadLines 更有效。我建议你做什么,下载一个基准工具,看看有什么适合你的。
【解决方案2】:

如果可能,最好将文件作为流处理。我什至不会称之为优化,我宁愿称之为不浪费。如果您可以使用流方法,则 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);
        }
    }
}

【讨论】:

    猜你喜欢
    • 2013-03-27
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2011-06-02
    相关资源
    最近更新 更多