Получить самое длинное имя

Мне нужен каталог с самым длинным именем. В RootDir может быть несколько каталогов с именами, начинающимися с "8000". Я хочу DirectoryInfo одного с самым длинным именем.

    Dim pCustID As String = "8000"
    Dim RootDir As New DirectoryInfo(CustPdfPath)
    Dim dirs() As DirectoryInfo
    dirs = Array.FindAll(RootDir.GetDirectories, Function(x) x.Name.StartsWith(pCustID))
    Dim myDir As DirectoryInfo = Array.Sort(RootDir.GetDirectories, _
                Function(x As DirectoryInfo, y As DirectoryInfo) _
                x.Name.Length > y.Name.Length).firstordefault

Конечно, я получаю: "Выражения не дают значения". Как исправить последнюю строку для сортировки по длине (самая длинная первая) и взять первую (самую длинную).

2 ответа

Решение

Давайте попробуем это (без использования DirectoryInfo)

Dim pCustID As String = "8000"
Dim RootDir As String = CustPdfPath
Dim longest = Directory.GetDirectories(RootDir) _
              .Where(Function(x) x.StartsWith(RootDir & "\" & pCustID)) _ 
              .OrderByDescending(Function(x) x.Length) _ 
              .FirstOrDefault()

или с помощью DirectoryInfo

Dim pCustID As String = "8000"
Dim RootDir As New DirectoryInfo(CustPdfPath)    
Dim longest = di.GetDirectories() _ 
                .Where(Function(x) x.Name.StartsWith(pCustID)) _ 
                .OrderByDescending(Function(x) x.Name.Length) _ 
                .FirstOrDefault()

Я обнаружил причину моей ошибки. Array.Sort не возвращает ничего, как указано в сообщении об ошибке. Вместо этого он просто сортирует массив на месте. Тогда я могу просто получить последний.

    Dim RootDir As New DirectoryInfo(CustPdfPath)
    Dim dirs() As DirectoryInfo
    dirs = Array.FindAll(RootDir.GetDirectories, Function(x) x.Name.StartsWith(CustPath))
    Array.Sort(RootDir.GetDirectories, _
                Function(x As DirectoryInfo, y As DirectoryInfo) x.Name.Length < y.Name.Length)
    Dim myDir As DirectoryInfo = dirs.LastOrDefault
Другие вопросы по тегам