c# - 列表的一部分按降序(按日期)排序,另一部分按升序(按字母顺序)?
问题描述
我有一个控件,它显示所选文件夹中所有 PDF 的列表。大多数这些 PDF 的名称(例如,会议纪要)都以日期开头。我希望这些 PDF 以降序显示,以便最新的 PDF 显示在顶部。
在同一个文件夹中,我还有一些名称不包含日期的 PDF(例如,策略)。我希望这些文件按字母顺序排列。
这是我拥有的列表类型以及我希望如何排序的示例:
- 2019-01-12 会议纪要.pdf
- 2018-11-19 会议议程.pdf
- 2018-06-02 会议纪要.pdf
- 2017-12-13 会议议程.pdf
- 2017-04-27 会议纪要.pdf
- 隐私政策.pdf
- 保障政策.pdf
- 福利政策.pdf
这是我尝试过的:
private void GenerateFolder()
{
folder_path = Server.MapPath(BaseFolder);
_folder_view = new StringBuilder();
if (Directory.Exists(folder_path))
{
DirectoryInfo info = new DirectoryInfo(folder_path);
FileInfo[] files = info.GetFiles().OrderByDescending(p => p.FullName).ToArray();
foreach (FileInfo file in files)
{
doStuff();
}
}
folder_view.Text = _folder_view.ToString();
}
使用此代码,名称以日期开头的 PDF 按我想要的降序(按日期)排序。但是其他名称不以日期开头的 PDF 并没有按照我想要的方式排序(按字母顺序)。有没有办法实现我的双重分类目标?
解决方案
我将创建一个自定义类,将日期和文件名的其余部分解析为单独的属性,然后您可以使用OrderByDescending
并对ThenBy
这些单独的属性进行排序。
public class ParsedFilename
{
public ParsedFilename(string filename)
{
FullName = filename;
if (filename.Length >= 12 &&
DateTime.TryParse(filename.Substring(0, 10), out var date))
{
Date = date;
Name = filename.Substring(11);
}
else
{
Date = null;
Name = filename;
}
}
public DateTime? Date { get; }
public string Name { get; }
public string FullName { get; }
}
你可以像这样使用它:
var data = new List<string>(new[]
{
"2019-01-12 Meeting minutes.pdf",
"Safeguarding policy.pdf",
"2017-04-27 Meeting minutes.pdf",
"2018-06-02 Meeting minutes.pdf",
"2017-12-13 Meeting agenda.pdf",
"Privacy policy.pdf",
"Welfare policy.pdf",
"2018-11-19 Meeting agenda.pdf"
});
var parsedData = data.Select(d => new ParsedFilename(d));
var sortedData = parsedData.OrderByDescending(d => d.Date)
.ThenBy(d => d.Name);
var output = sortedData.Select(d => d.FullName);
它产生以下输出:
2019-01-12 会议纪要
.pdf 2018-11-19 会议议程.pdf 2018-06-02 会议纪要.pdf 2017-12-13
会议
议程.pdf
2017-04-27 会议纪要
.pdf 隐私政策.pdf
保障政策.pdf
福利政策.pdf
根据目录中文件名的格式,您可能需要添加一些更健壮的解析。
推荐阅读
- python - 使用 find beautiful soup 使用 python 获取 href
- c++ - 如何在桌面应用程序中使用 WebRTC 进行语音聊天?
- aframe - 使用 A-Frame 日志组件时,如何防止日志再次显示在控制台上?
- ruby-on-rails - 你如何归因于form_tag?
- android - 自 sdk 更新以来,Google Play 控制台中的 NoClassDefFoundError ClassNotFoundException 错误
- tfs - 我们可以更改 TFS 2018 电子邮件警报的默认时区吗
- postgresql - 如何在 Fedora 30 上安装 pgAdmin 4?
- python - 检查字符串中是否只有指定的 Django 模板变量
- ms-access - MS Access 基本盘点
- c# - 如果 fiddler 代理打开,C# POSTing data to CGI script 有效,否则无效