Listbox加载指定目录Excel文件时如何按大小排序?排序条件加在何处?
按文件大小排序的最佳位置:LINQ查询阶段
当然是把排序逻辑加在LINQ查询语句里啦!这样不仅代码更简洁,逻辑也更集中,而且性能上也更高效——毕竟在生成最终文件数组前就完成排序,不用额外再处理一遍数据。
你可以直接在现有Where过滤之后,追加OrderBy(升序,小文件在前)或者OrderByDescending(降序,大文件在前)方法,用FileInfo.Length来获取文件大小作为排序依据。
不过这里有个小优化:尽量不要重复创建FileInfo对象(比如你原来的代码里Where和排序里各创建一次),可以先用Select把每个路径转成FileInfo,再统一过滤和排序,这样每个文件只生成一次FileInfo,效率更高。修改后的代码如下:
var files = Directory.GetFiles(FBD.SelectedPath, "*.xls") .Select(file => new FileInfo(file)) // 先转成FileInfo对象 .Where(info => info.CreationTime.Date >= DateTime.Today.Date && info.Name.Contains("AA")) // 用FileInfo的Name属性判断更准确 .OrderBy(info => info.Length) // 按文件大小升序排列,想要降序就用OrderByDescending .Select(info => info.FullName) // 再转回到文件路径字符串 .ToArray(); string[] dirs = Directory.GetDirectories(FBD.SelectedPath); foreach (string file in files) { listBox1.Items.Add(Path.GetFileName(file)); }
如果非要在foreach循环前处理的话,也可以先对files数组排序,比如用Array.Sort:
string[] files = Directory.GetFiles(FBD.SelectedPath, "*.xls") .Where(file => new FileInfo(file).CreationTime.Date >= DateTime.Today.Date && file.Contains("AA")) .ToArray(); // 在foreach前排序 Array.Sort(files, (fileA, fileB) => new FileInfo(fileA).Length.CompareTo(new FileInfo(fileB).Length)); string[] dirs = Directory.GetDirectories(FBD.SelectedPath); foreach (string file in files) { listBox1.Items.Add(Path.GetFileName(file)); }
但这种写法不如LINQ链式调用优雅,而且还是会重复创建FileInfo,所以更推荐第一种方式。
内容的提问来源于stack exchange,提问作者user2839067
相关产品推荐
相关产品推荐

