我有一个文件夹列表,想把最长的公共子串作为输出。
这是我的代码,看起来不是很好,
如何改善这些?
这些文件都来自我的RecursiveSearch
函数,它可能是D:\123,E:\456,F:\a\e\eff,我保存到xml。
后来从xml中读回来,想得到以前的决定。
文件可能会有上万个我在乎的是速度
var li = new List<string>()
{
@"C:\Users\jared\Desktop\fld1\eumaps\4.jfif",
@"C:\Users\jared\Desktop\fld2\eumaps - (2)\4.jfif",
@"C:\Users\jared\Desktop\fld4\ade\4.jfif",
@"C:\Users\jared\Desktop\fld4\abc\S.png",
@"C:\Users\jared\Desktop\fld1\file\Snipaste_2021-07-07_03-03-45.png",
};
//var shortest1 = li.OrderBy(name => name.Length).FirstOrDefault();
string shortest = li.Aggregate((a1, a2) => a1.Length < a2.Length ? a1 : a2);
string longest = li.Aggregate((a1, a2) => a1.Length > a2.Length ? a1 : a2);
string common = string.Concat(shortest.TakeWhile((c, i) => c == longest[i]));
// C:\Users\jared\Desktop\fld NOT MY WANT CAUSE THERE IS NO SUCH FOLDER.
if (!Directory.Exists(common))
{
common = common.Replace(common.Split("\\").Last(), "");
}
4条答案
按热度按时间w6lpcovy1#
如果有任何其他路径具有不同的长度并且在中间具有不同的路径,则您的方法将失败,因为您只是比较
shortest
和longest
。根据我的理解,您希望输出到匹配的文件夹(而不是文件夹或文件名的子字符串),即
C:\Users\jared\Desktop\
这是我的解决方案,运行在O(Nk)的解决方案,其中N是路径的数量和k是最短的可用长度.
工作样本代码here。
这也可以通过使用TrieData结构以更优化的方式(O(N + k))来完成,但是构建Trie需要额外的空间
woobm2wo2#
下面是一个使用Linq的简洁但性能不高的实现。对于
Transpose
操作符,它还依赖于MoreLinq包:输出量:
最长公共路径:C:/用户/jared/桌面
Try it on fiddle中的一个。
Transpose
运算符的签名:qacovj5a3#
你说
C:\Users\jared\Desktop\fld
不是你想要的,但是你想要什么呢?最嵌套的有效文件夹吗?只要拉到最后一个斜杠,或者使用Path方法得到你想要的位。o4tp2gmn4#
建议:为图像路径使用以下代码