Directory.GetDirectories , Сортировка по имени C#

Это звучит как дубликат, но все приведенные решения не удовлетворяют одному из требований сортировки по имени. например

J A1
J A2
J A3
J A10
J A11

Метод возвращает J A1, J A10, J A11, J A2, J A3. Но этого не ожидается, так как операционная система сортирует их по-другому.

ниже решения уже пробовали

var sorted = dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly).OrderBy(f => f.Name);

Array.Sort();

person Jay    schedule 13.01.2014    source источник
comment
comment
Вы пробовали реализацию, связанную с здесь: stackoverflow.com/a/1013055/2609288?   -  person Baldrick    schedule 13.01.2014
comment
@ Baldrick нет, позвольте мне попробовать и обновить   -  person Jay    schedule 13.01.2014
comment
@Baldrick Это решило проблему сортировки ( NumericComparer nc = new NumericComparer (); Array.Sort (strDir, nc);), однако применить это к Directoryinfo [] немного сложно.   -  person Jay    schedule 13.01.2014
comment
Из того, что вы сказали, мне не совсем понятно, что решено, а что не работает. Можете ли вы обновить свой вопрос, объясняя проблему, которая у вас все еще возникает с реализацией, которая у вас есть сейчас, с вашим текущим кодом? Без этого довольно трудно помочь вам в дальнейшем.   -  person Baldrick    schedule 13.01.2014
comment
@Baldrick сам опубликовал ответ, но кредит принадлежит вам.   -  person Jay    schedule 13.01.2014
comment
Рад, что у тебя получилось. Не обращайте внимания на кредит, просто рад помочь! :)   -  person Baldrick    schedule 13.01.2014


Ответы (1)


Спасибо Бальдрик за ценный комментарий. использование этого в конечном итоге решило проблему. могут быть и другие способы, но я остановился на этом.

 private void Walkdirectoryfulldepth(string dirPath, List<string> data)
        {
            DirectoryInfo dirInfo = new DirectoryInfo(dirPath);
            var sorted = dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly).ToList();
            DirectoryInfo[] subDirs = dirInfo.GetDirectories("*.*", SearchOption.TopDirectoryOnly);
            string[] strDir=new string[subDirs.Count()];
            int i =0;
            foreach (var item in subDirs)
            {
                strDir[i] = item.FullName;
                i++;
            }
             NumericComparer nc = new NumericComparer();
             Array.Sort(strDir, nc);
             foreach (var item in strDir)
            {
                data.Add(Path.GetFileName(item));
                Walkdirectoryfulldepth(item, data);
            }
            //foreach (var item in subDirs)
            //    Walkdirectoryfulldepth(item.FullName, data);

        }

Получите приведенный ниже класс из codeproject, реализованный аналогично StrCmpLogicalW логическая сортировка в Windows Explorer API.

NumericComparer
StringLogicalComparer
person Jay    schedule 13.01.2014