从列表中获取更相似的字符串

本文关键字:相似 字符串 获取 列表 | 更新日期: 2023-09-27 18:14:01

我有一个List,它包含我需要的所有远程路径

List<string> remotePath = MyTableWithRemotePath.Select(i => i.ID_SERVER_PATH).ToList();

我有一个字符串,它就是我正在查找的服务器。

string remotePath = "Path I'm looking for";

我必须找到列表中与我要查找的路径更匹配的路径。

我试过这个,但它不起作用

var matchingvalues = remotePath.FirstOrDefault(stringToCheck => stringToCheck.Contains(remotePath));

有什么建议吗?

编辑

示例:

我必须找到此路径的最佳匹配:C:''something''location''

这是我的清单:

- C:''something''location''XX''
- C:''something''location2''YY''
- C:''something''location3''AA''
- C:''something''location4''CS''

结果必须是第一个元素:

C:''something''location''directory''

从列表中获取更相似的字符串

我会说而不是:

string dir = @"some''path''im''looking''for";

将其分解为每个路径的数组。

string[] dirs = new string[n] { "some", "path", "im", "looking", "for" };

然后对列表进行迭代,同时检查数组中的每个项。每次有匹配项时,将其与键(完整路径(和值(匹配数(一起添加到另一个集合中。

for (int i = 0; i < remotePath.Count; i++)
{
    int counter = 0;
    for (int j = 0; j < dirs.Length; j++)
    {
        if (remotePath[i].Contains(dirs[j])
            counter++;
    }
    if (counter > 0)
        someStringIntDictionary.Add(remotePath[i], counter);
}

关于确定哪一个是"最佳匹配"的最后任务,老实说,我不确定该怎么做,但在谷歌上搜索C# find dicitonary key with highest value给了我这个:

https://stackoverflow.com/a/2806074/1189566

这个答案可能不是最有效的,因为在多个集合上嵌套循环,但它应该有效。

我想指出的是,如果文件名或子目录与dirs中的某个内容共享名称的一部分,那么这是不准确的。因此,使用数组中的第一个项"some",您可能会遇到以下场景中的错误:

"C:''something''location''directory''flibflam''file.pdf"

something将不正确地与some匹配,因此它实际上可能不是有效的匹配。您可能需要检查实际路径中目录的相邻字符,并确保它们是'字符。

var remotePaths = new List<string>
{
    @"C:'something'location'directory'",
    @"C:'something'location2'directory'",
    @"C:'something'location3'directory'",
    @"C:'something'location4'directory'"
};
var remotePath = @"C:'something'location'directory'";

var result = remotePaths
    .Select(p => new { p, mathes = p.Split('''').TakeWhile((x, i) => x == remotePath.Split('''')[i]).Count()})
    .OrderByDescending(p => p.mathes)
    .First().p;

结果:

C: ''something''location''directory''

代码遍历每个目录。创建解析它并为每个目录创建子目录,然后将每个子目录与remotePath子目录进行比较。最后,它取第一个匹配次数最多的。

最后我用这种方式完成了它,并完美地工作:

    var bestPath  = remotePaths.OrderByDescending(i => i.ID_FILE_PATH.Length)
                               .ToList()
                               .FirstOrDefault(i => rootPath.StartsWith(i.ID_FILE_PATH, StringComparison.InvariantCultureIgnoreCase));