如何在linq查询中排序?

时间:2010-11-26 19:15:13

标签: c# .net linq sorting io

所以我得到一些像这样的文件:

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?

4 个答案:

答案 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数组,它直接暴露扩展名,文件等属性名称...

希望这有帮助