我有一个控件,该控件显示所选文件夹中所有PDF的列表。这些PDF的大多数名称(例如,会议记录)以日期开头。我希望这些PDF降序显示,以便最新的PDF显示在顶部。
在同一文件夹中,我还有一些PDF文件,其名称 not 不包含日期(例如,策略)。我希望这些文件按字母顺序排序。
以下是我拥有的列表类型以及如何排序的示例:
这是我尝试过的:
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以我想要的降序排列(按日期)。但是其他名称不是 not 的PDF以日期开头不是按我希望的方式排序(按字母顺序)。有没有办法实现我的双重分类目标?
答案 0 :(得分:4)
我将创建一个自定义类,将日期和文件名的其余部分解析为单独的属性,然后可以使用myNamespace.X
和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; }
}
它产生以下输出:
2019-01-12会议记录.pdf
2018-11-19会议议程.pdf
2018-06-02会议记录.pdf
2017-12-13会议议程.pdf
2017-04-27会议纪要.pdf
隐私政策.pdf
保障政策.pdf
福利政策.pdf
根据目录中文件名的格式,您可能必须添加一些更可靠的分析。
答案 1 :(得分:1)
在评论中,LocEngineer建议(措辞):
首先使用一种基于正则表达式的技术(如对this question的回答所示)来确定那些以日期开头的文件名。接着 生成两个部分列表,然后将其合并。
根据该建议的精神,下面是一个可能解决方案的演示:
public void CustomFileNameOrderingDemo()
{
var files = new[]
{
"2017-04-27 Meeting minutes.pdf",
"2018-11-19 Meeting agenda.pdf",
"2019-01-12 Meeting minutes.pdf",
"2018-06-02 Meeting minutes.pdf",
"2017-12-13 Meeting agenda.pdf",
"Safeguarding policy.pdf",
"Welfare policy.pdf",
"Privacy policy.pdf",
};
var filesWithDates = FindFilesWithDates().OrderByDescending(f => f).ToList();
var filesWithoutDates = files.Except(filesWithDates).OrderBy(f => f);
var result = filesWithDates.Concat(filesWithoutDates);
IEnumerable<string> FindFilesWithDates()
{
return files.Where(f => Regex.IsMatch(f, @"^[0-9]{4}-[0-9]{2}-[0-9]{2} "));
}
}