如何在C#列表中对编号的文件名进行排序

时间:2019-06-16 18:19:30

标签: c#

我尝试对包含文件路径的列表进行排序。 我希望按它们中的数字对它们进行排序。

使用给定的代码,我无法获得预期的结果。

var mylist = mylist.OrderBy(x => int.Parse(Regex.Replace(x, "[^0-9]+", "0"))).ToList<string>();

我希望结果是:

c:\somedir\1.jpg
c:\somedir\2.jpg
c:\somedir\3.jpg
c:\somedir\7.jpg
c:\somedir\8.jpg
c:\somedir\9.jpg
c:\somedir\10.jpg
c:\somedir\12.jpg
c:\somedir\20.jpg

但是输出是随机的。

2 个答案:

答案 0 :(得分:3)

有一个简单的方法可以实现。 假设您有一个这样的字符串列表:

navigationController?.navigationBar.prefersLargeTitles = true

您可以通过以下方式获得所需的结果:

List<string> allThePaths = new List<string>()
{
    "c:\\somedir\\1.jpg",
    "c:\\somedir\\2.jpg",
    "c:\\somedir\\20.jpg",
    "c:\\somedir\\7.jpg",
    "c:\\somedir\\12.jpg",
    "c:\\somedir\\8.jpg",
    "c:\\somedir\\9.jpg",
    "c:\\somedir\\3.jpg",
    "c:\\somedir\\10.jpg"
};

注意:还请确保已包含LINQ:

List<string> sortedPaths = allThePaths
    .OrderBy(stringItem => stringItem.Length)
    .ThenBy(stringItem => stringItem).ToList();

Here是演示示例,以防万一。

可以找到更复杂的解决方案there

答案 1 :(得分:0)

一种更干净的方法是使用System.IO.Path

public IEnumerable<string> OrderFilesByNumberedName(IEnumerable<string> unsortedPathList) =>
    unsortedPathList
    .Select(path => new { name = Path.GetFileNameWithoutExtension(path), path }) // Get filename
    .OrderBy(file => int.Parse(file.name)) // Sort by number
    .Select(file => file.path); // Return only path