c# - 删除列表中包含另一个名称的名称

标签 c# list duplicates

我有一个文件,每一行都有“Name|Number”,我希望删除名称中包含列表中另一个名称的行。 例如,如果文件中有 "PEDRO|3"、 "PEDROFILHO|5"、 "PEDROPHELIS|1",我希望删除行 "PEDROFILHO|5"、 "PEDROPHELIS|1"。

列表有 180 万行,我是这样写的,但是太慢了:

List<string> names = File.ReadAllLines("firstNames.txt").ToList();
List<string> result = File.ReadAllLines("firstNames.txt").ToList();

foreach (string name in names)
{
    string tempName = name.Split('|')[0];
    List<string> temp = names.Where(t => t.Contains(tempName)).ToList();
    foreach (string str in temp)
    {
        if (str.Equals(name))
        {
            continue;
        }
        result.Remove(str);
    }
}
File.WriteAllLines("result.txt",result);

有人知道更快的方法吗?或者如何提高速度?

最佳答案

由于您要在单词中的任何位置查找匹配项,因此最终会得到 O(n2) 算法。您可以稍微改进实现以避免列表内的字符串删除,这本身就是一个 O(n) 操作:

var toDelete = new HashSet<string>();
var names = File.ReadAllLines("firstNames.txt");
foreach (string name in names) {
    var tempName = name.Split('|')[0];
    toDelete.UnionWith(
        // Length constraint removes self-matches
        names.Where(t => t.Length > name.Length && t.Contains(tempName))
    );
}
File.WriteAllLines("result.txt", names.Where(name => !toDelete.Contains(name)));

关于c# - 删除列表中包含另一个名称的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44074945/

相关文章:

c# - HTTP GET 服务器 - 错误 header

c# - 在年份范围之间创建一个 String[]

python - 从列表python创建字典

mysql - 强制 MySQL 在不使用 JOIN/UNION 的情况下从 WHERE IN 子句返回重复项?

c# - C# 的单例模式

c# - 发送电子邮件时出错

python - 反转列表中的元组

python - 分配到列表列表中的位置

C - 二维数组的问题

java - 检测 JSON 对象列表中的重复条目