按C#中的文件名对列表项[完整路径]排序

时间:2016-11-23 08:45:08

标签: c# list sorting

我有一个类型字符串列表。每个字符串都是文件的完整路径。现在我想按文件名对这个列表进行排序。

当我使用Sort()方法时,列表将按完整路径排序。但路径可能不同。

是否有一种简单的方法可以按照每个项目的最后一个之后的剩余部分对列表进行排序?

5 个答案:

答案 0 :(得分:7)

您可以使用System.IO.Path.GetFileName和LINQ:

files = files.OrderBy(System.IO.Path.GetFileName).ToList();

如果您想以不区分大小写的方式进行比较,可以传递StringComparer

files = files.OrderBy(System.IO.Path.GetFileName, StringComparer.InvariantCultureIgnoreCase).ToList();

请注意,OrderBy(和OrderByDescending)使用稳定的排序算法而不是List.Sort。这意味着所有相等的元素都保持原始顺序。

答案 1 :(得分:3)

您正在寻找Path.GetFileName

https://msdn.microsoft.com/en-us/library/system.io.path.getfilename(v=vs.110).aspx

   List<string> files = ...

   // when sorting via Sort we should compare file names
   files.Sort((left, right) => 
     string.Compare(Path.GetFileName(left), Path.GetFileName(right)));

Sort优于Linq OrderBy的优势是

    当Linq通过Sort 创建其他集合时,
  • .ToList()执行就地排序
  • 您可以在lambda函数中放置一个复杂的排序算法;在Linq的情况下,必须实现IComparer<T>接口

缺点是

  • IEnumerable<T>需要Sort时,Linq只想List<T>
  • Sort()使用不稳定的排序算法(如果两个项目被视为相等,则无法保证其在排序列表中的实际顺序)
  • 当前最简单的实施string.Compare(Path.GetFileName(left), Path.GetFileName(right))过于频繁地调用Path.GetFileName (大约是OrderBy的两倍)

答案 2 :(得分:1)

此示例代码,

 var getFileName = System.IO.Path.GetFileName("C:\temp\name.txt"); > temp.txt

 var getfileNameWithoutExtention = System.IO.Path.GetFileName("C:\temp\name.txt"); > name

 var getextention = System.IO.Path.GetFileName("C:\temp\name.txt"); > .txt



 List<string> patsh = new List<string>
        {
            @"C:\temp\name.txt",
            @"C:\music\ranbow.mp3",
            @"C:\net\core.cs",
            @"C:\java\fr.jar"
        };



 patsh = patsh.OrderBy(System.IO.Path.GetFileNameWithoutExtension).ToList();

如果你想用文件扩展名

 patsh = patsh.OrderBy(System.IO.Path.GetFileNameWithoutExtension).ThenBy(System.IO.Path.GetExtension).ToList();

答案 3 :(得分:0)

这可能会为你做到这一点

List<string> fullfilepath = new List<string>() { "C:\\text1.txt", "C:\\text2.txt", "D:\\text4.txt", "C:\\text3.txt", "C:\\text6.txt", "D:\\text5.txt" };
List<string> sortedfilename = fullfilepath.OrderBy(x => Path.GetFileName(x)).ToList();

答案 4 :(得分:-1)

你也可以按照这样的方式对它进行排序:

fileName = path.Split('\').Last();