Проблема по сортировке массива - PullRequest
0 голосов
/ 23 сентября 2011

У меня проблема с сортировкой массива по возрастанию, и я не знаю, как это исправить.

string[] filePath = Directory.GetFiles(fbdialog.SelectedPath.ToString(), "*", SearchOption.AllDirectories);
Array.Sort(filePath);

Вот значения filePath.

"C:\\Documents and Settings\\20110909\\DAR-AAP070127-20110909.ods"
"C:\\Documents and Settings\\20110909\\DAR-ALA061452-09050909.xls"
"C:\\Documents and Settings\\20110819\\DAR-AAP070127-20110819.xls"

Я хочу выглядеть так ..

"C:\\Documents and Settings\\20110909\\DAR-AAP070127-20110909.ods"
"C:\\Documents and Settings\\20110819\\DAR-AAP070127-20110819.xls"
"C:\\Documents and Settings\\20110909\\DAR-ALA061452-09050909.xls"

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 23 сентября 2011

Сортировка по "EmpNo", например, "AAP070127":

string[] sortedFiles = Directory
    .GetFiles(fbdialog.SelectedPath, "*", SearchOption.AllDirectories)
    .OrderBy(n => Path.GetFileName(n).Split('-')[1])
    .ToArray();

Обновление

И без Linq, как вы упомянули, используя C # 2.0.Далее используется пользовательский компаратор для сравнения только кодов «EmpNo» в именах файлов.Решение ожидает, что ваши имена файлов будут правильно сформированы, т. Е. Они будут содержать «EmpNo» в формате имен файлов вашего примера.

    [Test]
    public void Sort()
    {
        string[] files = Directory
            .GetFiles(fbdialog.SelectedPath, "*", SearchOption.AllDirectories);

        Array.Sort(files, new EmpNoFileComparer());
    }

    private class EmpNoFileComparer : IComparer<string>
    {
        public int Compare(string x, string y)
        {
            string empNoX = Path.GetFileName(x).Split('-')[1];
            string empNoY = Path.GetFileName(y).Split('-')[1];

            return empNoX.CompareTo(empNoY);
        }
    }
1 голос
/ 23 сентября 2011

Сортировать по имени:

var result = filePath.OrderBy(p => Path.GetFileName(p));
1 голос
/ 23 сентября 2011

Вот версия с использованием некоторого LINQ. Также обратите внимание, что если вам нужны только имена файлов, а не сами файлы, тогда можно использовать DirectoryInfo.GetFiles() вместо Directory.GetFiles().

var filePaths = new DirectoryInfo(fbdialog.SelectedPath.ToString())
    .GetFiles("*", SearchOption.AllDirectories)
    .OrderBy(f => f.Name)
    .Select(f => f.FullName);
0 голосов
/ 23 сентября 2011
using System.Linq; // requires .NET 3.5+

IEnumerable<string> r =
    new DirectoryInfo(fbdialog.SelectedPath) // no need for ToString()
        .GetFiles("*", SearchOption.AllDirectories)
        .Select(f => f.Name) // DAR-ALA061452-09050909.xls
        .Select(f => f.Substring(4, 9)) // ALA061452
        .OrderBy(f => f);

или короче:

new DirectoryInfo(fbdialog.SelectedPath)
    .GetFiles("*", SearchOption.AllDirectories)
    .OrderBy(f => f.Name.Substring(4, 9));
...