利用Lambda表达式解决c#文件名排序问题(是100大还是11大的问题)

1、问题背景:

有时需要对输出的文件列表进行排序,如直接使用List<T>.Sort()方法排序时,遇到9, 10,11和100排序的问题,往彺会出现2.xxx大于100.xxx (其中,xxx代表文件的后缀名) 等类似的情形,这明显不是我们要想的。

另外,在同一组文件中,假如都以: NNN_1_ABC.xxx,NNN_2_ABC.xxx……NNN_NNNN_ABC.xxx等形式(其中N为数字),此时,在NNN相同情况下,我们希望NNN_100比NNN_2 要“大”。

比如下面的文件列表,就是直接使用List<T>.Sort()方法排序产生的:

D:\ChineseCalendar\AI_样式\OK\00_CoverFM封面\00FM_01+圆形光盘+竖向.svg
D:\ChineseCalendar\AI_样式\OK\00_CoverFM封面\00FM_02_牛皮纸背景+蛇圈台历+新年快乐+大片小文字广告+普通广告.svg
………………// 这里还有一些文件(下"//"同)……………………
D:\ChineseCalendar\AI_样式\OK\00_CoverFM封面\00FM_19+彩色树叶+曲线+左中右上部广告.svg
………………// ……………………
D:\ChineseCalendar\AI_样式\OK\02\02_小朋友_蓝天白云向日葵等12月历.svg
………………// ……………………
D:\ChineseCalendar\AI_样式\OK\09\09_左上小图+右上横向大图+左下文字广告+右下含周序号单月历x12_OK.svg
D:\ChineseCalendar\AI_样式\OK\10\10_铁夹+两边花纹+中间12月年历+底部广告.svg
………………// ……………………
D:\ChineseCalendar\AI_样式\OK\100\100_HappyFall+(2x2+4x2)=12月历.svg
………………// ……………………
D:\ChineseCalendar\AI_样式\OK\109\109_渐变标签+3x2=6月历半年历.svg
D:\ChineseCalendar\AI_样式\OK\11\11_Calendar圆形贴纸_OK.svg

我们希望是0-9-10-11...100-101..200...201...,而不是上面那样。

2、解决方法:

先贴代码:

 /// <summary>
        /// 对List<string>文件列表排序
        /// </summary>
        /// <param name="listSvgFiles">List<string>文件列表排序</param>
        /// <param name="isOrderByDesc">是否倒序</param>
        /// <returns>排序结果</returns>
        private static List<string> GetOrderListOfSvgFiles(List<string> listSvgFiles, bool isOrderByDesc)
        {
            //先利用Lambda表达式正序排列
            List<string> orderedFile = (from s in listSvgFiles
                           let Split = s.Split('_')
                           let Str = Path.GetFileName(s)
                           where Str.IndexOf("FM") >= 0 || Regex.IsMatch(Str, @"\b\d+")
                           select s)
                   .OrderBy(x => int.Parse(Path.GetFileName(x).Split('_')[0].TrimEnd("FM".ToCharArray())))
                   .ThenBy(y => Path.GetFileName(y).Split('_')[1])

                   .ToList();
            //如果逆序排列
            if (isOrderByDesc)
            {
                orderedFile.Reverse();
            }

            return orderedFile;
        }

说明:这里用加粗文字表示重点,同时,如你有不同需求,可以根据实际需要修改。

//调用方法:

List<string> orderedFileList = GetOrderListOfSvgFiles(listSvgFiles, isOrderByDesc);

最后,让我们来个时光穿越。这是最近做的未来几千年的年历样本,嘿嘿!!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值