时间:2019-04-18 11:15:03

标签: c# linq

我有一个控件,该控件显示所选文件夹中所有PDF的列表。这些PDF的大多数名称(例如,会议记录)以日期开头。我希望这些PDF降序显示,以便最新的PDF显示在顶部。

在同一文件夹中,我还有一些PDF文件,其名称​​ not 不包含日期(例如,策略)。我希望这些文件按字母顺序排序。

以下是我拥有的列表类型以及如何排序的示例:

  • 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以我想要的降序排列(按日期)。但是其他名称不是 not 的PDF以日期开头不是按我希望的方式排序(按字母顺序)。有没有办法实现我的双重分类目标?

2 个答案:

答案 0 :(得分:4)

我将创建一个自定义类,将日期和文件名的其余部分解析为单独的属性,然后可以使用myNamespace.XOrderByDescending对这些单独的属性进行排序。

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