7

我有一个包含 40 个文件的目录,名称从 0 到 39(例如),我正在尝试获取名称中数字最大的文件(这意味着我需要获取“39”)我正在尝试对目录进行排序..我尝试使用以下主题:

如何检索目录中的文件列表,按名称排序

在 C# 中对 Directory.GetFiles 的结果进行排序

没有什么对我有用..我尝试了每种方法-使用Linq和其他方法..我不知道为什么..

我得到以下排序结果(检查下图): 在此处输入图像描述

谢谢您的帮助,

丁布拉查。

4

3 回答 3

8

以这种方式对它们进行排序是合乎逻辑的,您将引入一些语义来按数字对其进行排序,即将所有文件名解析为数字,然后按此对文件进行排序。

就像是

files.OrderBy(path => Int32.Parse(Path.GetFileNameWithoutExtension(path)))

用于Last()获取编号最大的文件。

于 2012-07-29T23:11:07.863 回答
2

Windows中有一个本机函数StrCmpLogicalW,可以将字符串中的数字作为数字而不是字母进行比较。制作一个调用该函数并将其用于比较的比较器很容易。

public class StrCmpLogicalComparer : Comparer<string>
{
    [DllImport("Shlwapi.dll", CharSet = CharSet.Unicode)]
    private static extern int StrCmpLogicalW(string x, string y);

    public override int Compare(string x, string y)
    {
        return StrCmpLogicalW(x, y);
    }
}

这是一个示例程序,它将显示默认排序和StrCmpLogicalW排序之间的差异

class Program
{
    static void Main()
    {
        List<string> items = new List<string>()
        {
            "Example1.txt", "Example2.txt", "Example3.txt", "Example4.txt", "Example5.txt", "Example6.txt", "Example7.txt", "Example8.txt", "Example9.txt", "Example10.txt",
            "Example11.txt", "Example12.txt", "Example13.txt", "Example14.txt", "Example15.txt", "Example16.txt", "Example17.txt", "Example18.txt", "Example19.txt", "Example20.txt"
        };

        items.Sort();

        foreach (var item in items)
        {
            Console.WriteLine(item);
        }

        Console.WriteLine();

        items.Sort(new StrCmpLogicalComparer());

        foreach (var item in items)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();
    }
}

哪个输出

Example1.txt
Example10.txt
Example11.txt
Example12.txt
Example13.txt
Example14.txt
Example15.txt
Example16.txt
Example17.txt
Example18.txt
Example19.txt
Example2.txt
Example20.txt
Example3.txt
Example4.txt
Example5.txt
Example6.txt
Example7.txt
Example8.txt
Example9.txt

Example1.txt
Example2.txt
Example3.txt
Example4.txt
Example5.txt
Example6.txt
Example7.txt
Example8.txt
Example9.txt
Example10.txt
Example11.txt
Example12.txt
Example13.txt
Example14.txt
Example15.txt
Example16.txt
Example17.txt
Example18.txt
Example19.txt
Example20.txt
于 2016-09-01T20:58:16.473 回答
0

这是 VB.NET 检索最高编号的名称。将 OrderByDescending 键更改为 x.LastWriteTime 可获得最新文件。

    Dim OldName As String = String.Empty
    Dim DI As New IO.DirectoryInfo("C:\")
    For Each FI As IO.FileInfo In DI.GetFiles("*.*").OrderByDescending(Function(x) x.Name)
        OldName = FI.FullName
        Exit For
    Next
于 2015-01-29T15:57:02.570 回答