我有一个类型字符串列表。每个字符串都是文件的完整路径。现在我想按文件名对这个列表进行排序。
当我使用Sort()方法时,列表将按完整路径排序。但路径可能不同。
是否有一种简单的方法可以按照每个项目的最后一个之后的剩余部分对列表进行排序?
答案 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
的优势是
Sort
创建其他集合时,.ToList()
执行就地排序
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();