gpt4 book ai didi

c# - 如何使用 LINQ 使用条件按子字符串对文件名进行排序?

转载 作者:行者123 更新时间:2023-11-30 15:52:36 24 4
gpt4 key购买 nike

我在一个文件夹及其子文件夹中有一些 Excel (.xlsx) 文件,我想在我的网站上列出这些文件。文件名具有以下格式:

2018_MyData_Day.xlsx
2018_MyData_Month.xlsx
2018_MyData_Year.xlsx
2019_MyData_Day.xlsx
2019_MyData_Month.xlsx
2019_MyData_Year.xlsx

注意:DayMonthYear 是文本,不是实际数字日、月或年份(以防误导)。

我需要使用降序文件名显示这些文件名,但按YearDayMonth 以特定顺序分组.因此,使用上面的列表,输出应该是:

2019_MyData_Year.xlsx
2018_MyData_Year.xlsx

2019_MyData_Day.xlsx
2018_MyData_Day.xlsx

2019_MyData_Month.xlsx
2018_MyData_Month.xlsx

我使用以下命令按年份和 DayMonthYear 子字符串对文件名进行排序,但子字符串不是正确排序:

var fileGroup = (
from file in Directory.EnumerateFiles(myPath, searchPattern: "*.xlsx", searchOption: SearchOption.AllDirectories)
let fileName = Path.GetFileName(file)
orderby fileName descending
select fileName
).OrderBy(f => f.Substring(f.LastIndexOf("_")))

我确定我需要一个条件,因为所需的顺序是自定义的,但我不确定如何实现它。

这是否可能或是否有更好的方法来实现我想要的输出?

谢谢!

最佳答案

为什么不在将文件名投影到两个属性的地方使用 Select:

  • 文件年份:2018、2019,第一个下划线之前的所有内容
  • FilePeriod:一个整数,其中 (0) = 年,(1) = 日,(2) = 月,第二个下划线之后的部分

.

var underscore = new char[] {'_'};
var orderedFiles = originalFiles.Select(fileName =>
{
// TODO: decide what to do if filename incorrect format
var splitFileName = fileName.Split(underscore);

int filePeriod;
switch (splitFileName[2])
{
case "Year":
filePeriod = 0;
break;
case "Day":
filePeriod = 1;
break;
case "Month":
filePeriod = 2;
break;
default:
filePeriod = 3;
break;
}

return new
{
FileYear = Int32.Parse(splitFileName[0]),
FilePeriod = filePeriod,
OriginalFileName = fileName,
};
})

// sort:
.OrderBy(splitFile => splitFile.FileYear)
.ThenBy(splitFile => splitFile.FilePeriod)

// back to original filename
.Select(splitFile => splitFile.OriginalFileName);

关于c# - 如何使用 LINQ 使用条件按子字符串对文件名进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54093426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com