您好,登錄后才能下訂單哦!
這篇文章主要介紹“C#怎么對文件名智能排序”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“C#怎么對文件名智能排序”文章能幫助大家解決問題。
在文件夾中,我們經常有類似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是這種方式),然而,按照常規的字符串排序算法的到的結果是s_1.txt、s_10.txt、s_11.txt、s_2.txt(Windows XP是這種方式)。
要實現方式1所需要的智能排序效果,我們的排序算法需要滿足如下規則:
非數字部分按照字符串排序
數字部分按照大小排序
規則1的優先級高于規則2的優先級
這個規則看起來簡單,但是實現起來卻不是那么容易,因為我們的文件名沒有太大的約束,許多文件名時多段式字符串和數字混合在一起的,文件名之間也沒有規律可循。由于今天寫個小程序的時候需要這種功能,我在網上找了一下,沒有什么合適的通用算法,便自己寫了一個(實際上寫了好幾個,這個是最滿意的一個)。
算法的原理很簡單。
將字符串中的數字左側填充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查詢的時候加上一個分組的功能,這里就懶得寫了。
關于“C#怎么對文件名智能排序”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。