所以我得到一些像这样的文件:
int pathLength = path.Length + 1;
var files = Directory.GetFiles ( path, "*.*", SearchOption.AllDirectories )
.Where ( s => s.EndsWith ( ".bmp", StringComparison.OrdinalIgnoreCase ) ||
s.EndsWith ( ".jpg", StringComparison.OrdinalIgnoreCase ) )
.Select ( s => s.Substring ( pathLength, s.Length - pathLength ) )
.ToList ( );
并且在排序之前就是这样:
FileComparer fileComparer = new FileComparer ( );
files.Sort ( fileComparer );
但是对于Sort我需要使用ToList。我想知道我是否可以以同样的方式将排序添加到Linq并摆脱ToList?
答案 0 :(得分:4)
您正在寻找OrderBy
method:
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".bmp", ".jpg" };
int pathLength = path.Length + 1;
var files = Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories)
.Where(s => extensions.Contains(Path.GetExtension(s)))
.Select(s => s.Substring(pathLength))
.OrderBy(s => s, new FileComparer());
您可以使用
替换FileComparer
课程
.OrderBy(s => !s.Contains('\\')).ThenBy(s => s)
自false < true
起,这将对以\\
开头的字符串排序。
答案 1 :(得分:2)
使用OrderBy方法。
您的代码将从 -
更改files.Sort((x, y) => string.Compare(x.fileName, y.fileName));
到 -
files.OrderBy(x => x.fileName);
<强>更新强>
files.OrderBy(x => x.fileName.Contains(@"\\")).ThenBy(x => x.fileName);
答案 2 :(得分:1)
.OrderBy(f => f, new FileComparer())
(假设FileComparer实现IComparer<string>
)
答案 3 :(得分:1)
您可以采取一些措施来改进代码:
如前所述,使用 OrderBy 进行排序
将您的请求编写为 LINQ表达式,而不是连续的方法调用:
var files = (from file in Directory.GetFiles ( path, "*.*", SearchOption.AllDirectories )
where file.EndsWith ( ".bmp", StringComparison.OrdinalIgnoreCase ) ||
file.EndsWith ( ".jpg", StringComparison.OrdinalIgnoreCase )
orderby new FileComparer()
select file);
上面的代码与你的代码相同,但更优雅。
获取路径,扩展名,文件名...我强烈建议您使用 System.IO.Path 帮助程序方法,而不是执行字符串操作,如substring或contains !!
您可以实例化一个 DirectoryInfo 并调用GetFiles方法,而不是使用Directory.GetFiles:这个方法有一个优点就是返回一个FileInfo数组,它直接暴露扩展名,文件等属性名称...
希望这有帮助