最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#對文件名智能排序的算法

 更新時間:2022年06月17日 14:15:00   作者:天方  
這篇文章介紹了C#對文件名智能排序的算法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

在文件夾中,我們經(jīng)常有類似s_1.txt、s_2.txt、s_10.txt、s_11.txt這樣的命名方式,我們期望的排序方式是s_1.txt、s_2.txt、s_10.txt、s_11.txt(Vista & Windows7是這種方式),然而,按照常規(guī)的字符串排序算法的到的結(jié)果是s_1.txt、s_10.txt、s_11.txt、s_2.txt(Windows XP是這種方式)。

要實現(xiàn)方式1所需要的智能排序效果,我們的排序算法需要滿足如下規(guī)則:

  • 非數(shù)字部分按照字符串排序

  • 數(shù)字部分按照大小排序

  • 規(guī)則1的優(yōu)先級高于規(guī)則2的優(yōu)先級

這個規(guī)則看起來簡單,但是實現(xiàn)起來卻不是那么容易,因為我們的文件名沒有太大的約束,許多文件名時多段式字符串和數(shù)字混合在一起的,文件名之間也沒有規(guī)律可循。由于今天寫個小程序的時候需要這種功能,我在網(wǎng)上找了一下,沒有什么合適的通用算法,便自己寫了一個(實際上寫了好幾個,這個是最滿意的一個)。

算法的原理很簡單。

  • 將字符串中的數(shù)字左側(cè)填充0,變成定長的文件名。
    上述文件被命名為s_01.txt、s_02.txt、s_10.txt、s_11.txt

  • 將新文件名按照默認字符串排序算法排序

代碼如下:

static Regex digitRegex = new Regex(@"\d+");
static string[] SmartSort(IEnumerable<string> files)
{
    //這里只傳文件名,以避免不必要的開銷,不同的文件夾的文件沒有智能排序的必要
    var maxLength = files.Max(file => digitRegex.Matches(file).Cast<Match>().Max(num => num.Length));

    var query = from file in files
                let sortFile = digitRegex.Replace(file, m => m.Value.PadLeft(maxLength, '0'))
                orderby sortFile
                select file;

    return query.ToArray();
}

static void Main(string[] args)
{
    var files = Directory.GetFiles(@"R:\22").Select(i=>Path.GetFileName(i));

    Console.WriteLine(string.Join("\r\n", SmartSort(files)));
}

這個算法可用于文件夾或同種類型的文件排序,對于不同的類型的文件的智能排序,還需要在linq查詢的時候加上一個分組的功能,這里就懶得寫了。

這個算法談不上高效(這個算法只用來對一個文件夾下的所有文件排序,實際上也不存在什么效率問題),但卻是我嘗試的幾種算法中最簡單的一個,也是我最滿意的一個,目前沒有發(fā)現(xiàn)什么bug,如果誰有更合適的算法,歡迎指教。

到此這篇關(guān)于C#對文件名排序的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • DataGridView帶圖標的單元格實現(xiàn)代碼

    DataGridView帶圖標的單元格實現(xiàn)代碼

    這篇文章主要為大家詳細介紹了DataGridView帶圖標的單元格的實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C#解決多IfElse判斷語句和Switch語句問題的方法分享

    C#解決多IfElse判斷語句和Switch語句問題的方法分享

    這篇文章主要為大家介紹C#如何使用設(shè)計模式中的策略模式和委托來解決多個IfElse判斷語句和Switch語句,這種替換方式在其他語言也一樣可以做到,感興趣的可以了解一下
    2022-12-12
  • C#中常用的正則表達式

    C#中常用的正則表達式

    本文主要介紹了C#中常用的正則表達式。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • C#中的協(xié)變與逆變小結(jié)

    C#中的協(xié)變與逆變小結(jié)

    這篇文章主要介紹了C#中的協(xié)變與逆變的相關(guān)知識,在泛型或委托中,如果不使用協(xié)變或逆變,那么泛型類型是一個固定類型,而使用協(xié)變或逆變的話,則泛型類型可以實現(xiàn)多態(tài)化,需要的朋友可以參考下
    2021-10-10
  • C#實現(xiàn)剪刀石頭布游戲

    C#實現(xiàn)剪刀石頭布游戲

    這篇文章主要為大家詳細介紹了C#實現(xiàn)剪刀石頭布游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 通過C#實現(xiàn)獲取PDF頁面大小、方向和旋轉(zhuǎn)角度

    通過C#實現(xiàn)獲取PDF頁面大小、方向和旋轉(zhuǎn)角度

    在處理PDF文件時,了解頁面的大小、方向和旋轉(zhuǎn)角度等信息對于PDF的顯示、打印和布局設(shè)計至關(guān)重要,本文將介紹如何使用免費.NET?庫通過C#來讀取PDF頁面的這些屬性,需要的朋友可以參考下
    2024-08-08
  • 如何使用C#讀寫鎖ReaderWriterLockSlim

    如何使用C#讀寫鎖ReaderWriterLockSlim

    這篇文章向大家介紹了讀寫鎖ReaderWriterLockSlim,其優(yōu)點就是多個線程可以同時讀取該對象,要了解更多讀寫鎖的知識,仔細閱讀下文吧
    2015-07-07
  • 基于C#實現(xiàn)的輕量級多線程隊列圖文詳解

    基于C#實現(xiàn)的輕量級多線程隊列圖文詳解

    這篇文章主要給大家介紹了關(guān)于基于C#實現(xiàn)的輕量級多線程隊列的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用C#具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-08-08
  • C#使用oledb操作excel文件的方法

    C#使用oledb操作excel文件的方法

    這篇文章主要介紹了C#使用oledb操作excel文件的方法,涉及C#中oledb操作excel的相關(guān)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05
  • C#服務(wù)生命周期:Singleton、Scoped、Transient用法及說明

    C#服務(wù)生命周期:Singleton、Scoped、Transient用法及說明

    文章介紹了三種服務(wù)生命周期:單例、作用域和瞬態(tài),并討論了如何在ASP.NETCore中使用這些生命周期管理服務(wù),單例在應(yīng)用程序生命周期中只有一個實例,作用域在每個請求中創(chuàng)建一個新實例,瞬態(tài)每次請求時創(chuàng)建一個新實例
    2025-01-01

最新評論

水城县| 抚州市| 富锦市| 吉安县| 济南市| 安龙县| 清丰县| 柯坪县| 平阳县| 兴山县| 淳化县| 和林格尔县| 曲松县| 承德市| 含山县| 临邑县| 安化县| 揭西县| 罗甸县| 镇平县| 封开县| 富蕴县| 襄汾县| 太仓市| 青浦区| 稷山县| 庆阳市| 奉节县| 龙门县| 上饶县| 尚义县| 东方市| 高邮市| 正宁县| 涟水县| 油尖旺区| 怀远县| 定州市| 岗巴县| 柘城县| 金坛市|