Я получил список файлов и каталогов List<string> pathes
. Теперь я хотел бы вычислить самую глубокую общую ветвь, которую каждый путь разделяет друг с другом.
Можно предположить, что все они имеют общий путь, но вначале это неизвестно.
Скажем, у меня есть следующие три записи:
- C:/Hello/World/This/Is/An/Example/Bla.cs
- C:/Привет/Мир/Это/Есть/Не/Пример/
- C:/Привет/Земля/Бла/Бла/Бла
Это должно привести к результату: C:/Hello/, поскольку Земля разрывает эту «цепочку» подкаталогов.
Второй пример:
- C:/Hello/World/This/Is/An/Example/Bla.cs
- C:/Привет/Мир/Это/Есть/Не/Пример/
-> C:/Привет/Мир/Это/Есть/
Как бы вы поступили? Я попытался использовать string.split(@"/") и начать с первой строки и проверить, содержится ли каждая часть этого массива в других строках. Однако это был бы очень дорогой вызов, поскольку я итерирую (list_of_entries)^list_of_entries. Есть ли лучшее решение?
Моя текущая попытка будет выглядеть примерно так (С# + LINQ):
public string CalculateCommonPath(IEnumerable<string> paths)
{
int minSlash = int.MaxValue;
string minPath = null;
foreach (var path in paths)
{
int splits = path.Split('\\').Count();
if (minSlash > splits)
{
minSlash = splits;
minPath = path;
}
}
if (minPath != null)
{
string[] splits = minPath.Split('\\');
for (int i = 0; i < minSlash; i++)
{
if (paths.Any(x => !x.StartsWith(splits[i])))
{
return i >= 0 ? splits.Take(i).ToString() : "";
}
}
}
return minPath;
}