从列表中获取更相似的字符串
本文关键字:相似 字符串 获取 列表 | 更新日期: 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));