C#在列表条目名称中按日期排序列表

时间:2017-09-08 09:32:21

标签: c# sorting listbox directoryinfo

我有一个ListBox,由DirectoryInfo填充:

FileInfo[] files = (new DirectoryInfo(Program.pathtofiles())).GetFiles();
            for (int i = 0; i < (int)files.Length; i++)
            {
                FileInfo fileName = files[i];
                this.ListBox.Items.Add(fileName);
            }

一个项目看起来像:

  

DATA_department_08-09-2017.pdf

所以我的问题是如何按最后日期对ListBox中的Itmes进行排序?我知道ListBox有一些排序函数,但它们对我不起作用。

2 个答案:

答案 0 :(得分:1)

因此文件名包含三个标记,最后一个是日期,您可以使用此LINQ方法:

var sortedPaths = Directory.EnumerateFiles(Program.pathtofiles())
    .Select(Path => new { Path, Name = Path.GetFileNameWithoutExtension(Path) })
    .Select(x => new { x.Path, Date = DateTime.Parse(x.Name.Split('_').Last()) })
    .OrderBy(x => x.Date)
    .Select(x => x.Path);

如果您想重新排序列表项而不从文件系统中读取:

var sortedPaths = this.ListBox.Items.Cast<string>()
    .Select(Path => new { Path, Name = Path.GetFileNameWithoutExtension(Path) })
    .Select(x => new { x.Path, Date = DateTime.Parse(x.Name.Split('_').Last()) })
    .OrderBy(x => x.Date)
    .Select(x => x.Path);
this.ListBox.Items.AddRange(sortedPaths.ToArray());

如果您希望上次日期先使用OrderByDescending

答案 1 :(得分:0)

文件名只是字符串,但您可以尝试将文件名解析为具有日期时间字段且文件名为属性的自定义类。您必须从文件名中剪切日期部分并将其解析为实际日期时间类型

然后你可以使用linq来订购这里提到的文件列表https://stackoverflow.com/a/5813530/4318778