代码之家  ›  专栏  ›  技术社区  ›  Joan Venge

如何在LINQ查询中排序?

  •  0
  • Joan Venge  · 技术社区  · 14 年前

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

    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 );
    

    但我需要用托利斯。我想知道我是否可以用同样的方法把它添加到LINQ中,然后去掉Tolist?

    4 回复  |  直到 14 年前
        1
  •  4
  •   SLaks    14 年前

    你在找 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 ,这将对以开头的字符串进行排序 \\ 在其他人之前。

        2
  •  2
  •   Unmesh Kondolikar    14 年前

    使用 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);
    
        3
  •  1
  •   Diego Mijelshon    14 年前
    .OrderBy(f => f, new FileComparer())
    

    (这假定文件比较器实现 IComparer<string> )

        4
  •  1
  •   AFract    14 年前

    您可以做一些事情来改进代码:

    • 如前所述,使用 排序 用于排序

    • 将您的请求作为 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.路径 帮助器方法,而不是执行字符串操作,如子字符串或包含!!

    • 而不是使用directory.getfiles,您可以实例化 董事会信息 并调用getfiles方法:该方法的优点是返回一个fileinfo数组,它直接公开扩展名、文件名等属性。

    希望这有帮助