Найдите общий родительский путь в списке файлов и каталогов.C#

Место общения программистов C#
Ответить
Anonymous
 Найдите общий родительский путь в списке файлов и каталогов.

Сообщение Anonymous »

Я получил список файлов и каталогов. Список путей. Теперь я хотел бы вычислить самую глубокую общую ветвь, которую каждый путь разделяет друг с другом.

Мы можем предположить, что все они имеют общий путь, но это неизвестно в начало.

Предположим, у меня есть следующие три записи:
  • C :/Hello/World/This/Is/An/Example/Bla.cs
  • C:/Hello/World/This/Is/Not/An/Example/
  • C:/Hello/Earth/Bla/Bla/Bla
Это должно дать результат: C:/ Привет/, поскольку Земля разрывает эту «цепочку» подкаталогов.

Второй пример:
  • C:/Hello/World/This/Is/An/Example/Bla.cs
    C:/Hello/World/This/Is/Not/An/Example/< /li>
-> C:/Hello/World/This/Is/

Как бы вы поступили? Я попытался использовать string.split(@"/"), начал с первой строки и проверил, содержится ли каждая часть этого массива в других строках. Однако это будет очень дорогостоящий вызов, поскольку я повторяю (list_of_entries)^list_of_entries. Есть ли лучшее решение?

Моя текущая попытка будет примерно следующей (C# + LINQ):

public string CalculateCommonPath(IEnumerable 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)))
{
return i >= 0 ? splits.Take(i).ToString() : "";
}
}
}
return minPath;
}


Подробнее здесь: https://stackoverflow.com/questions/248 ... irectories
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»