排序数组的问题

时间:2011-09-23 09:26:40

标签: c# .net .net-2.0 sorting

我在以升序形式排序数组时遇到问题,我不知道如何修复它。

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 个答案:

答案 0 :(得分:1)

按文件名排序:

var result = filePath.OrderBy(p => Path.GetFileName(p));

答案 1 :(得分:1)

这是一个使用LINQ的版本。 另请注意,如果您只需要文件名而不是文件本身,则可以使用DirectoryInfo.GetFiles()而不是Directory.GetFiles()

var filePaths = new DirectoryInfo(fbdialog.SelectedPath.ToString())
    .GetFiles("*", SearchOption.AllDirectories)
    .OrderBy(f => f.Name)
    .Select(f => f.FullName);

答案 2 :(得分:1)

按“EmpNo”排序,例如“AAP070127”:

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

<强>更新

如果你提到使用C#2.0而没有Linq。以下使用自定义比较器仅比较文件名中的“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);
        }
    }

答案 3 :(得分:0)

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));