繁体   English   中英

在 C# 中按升序对文件夹的文件进行排序

[英]sort files of folder in ascending order in C#

我想按升序对文件夹的文件进行排序,以便我可以正确组合这些文件,但我得到的 output 是 1,10,11,我希望 output 是 1,2,3。明智的。 我正在使用这个,

                DirectoryInfo di = new DirectoryInfo(source_path);
                FileInfo[] arrFi = di.GetFiles("*.*");
                //arrFi.OrderBy(fi=>fi.LastWriteTime);
                Array.Sort(arrFi.OrderBy(fi => fi.LastWriteTime));

目前尚不清楚期望的结果是什么样的。 如果您想按文件的最后写入时间对文件进行排序,则可以使用简单的 Linq 查询:

  var arrFi = new DirectoryInfo(source_path)
    .EnumerateFiles("*.*")
    .OrderBy(file => file.LastWriteTime)
    .ToArray();

如果您想按文件名称以自然顺序(即"1" < "5" < "9" < "10" < "12" < "100" )对文件进行排序,则查询本身将与前一个一样简单:

  var arrFi = new DirectoryInfo(source_path)
    .EnumerateFiles("*.*")
    .OrderBy(file => file.Name, new StringNaturalComparer(null))
    .ToArray();

但是你必须实现比较器

  public sealed class StringNaturalComparer : IComparer<String> {
    private readonly IComparer<string> m_Comparer;

    private static List<string> ToChunks(string value) {
      List<string> result = new();

      StringBuilder sb = null;

      bool isDigit = false;

      foreach (var c in value) {
        if (sb is null) {
          sb = new StringBuilder(value.Length);
          isDigit = char.IsDigit(c);
          sb.Append(c);
        }
        else if (isDigit != char.IsDigit(c)) {
          result.Add(sb.ToString());
          sb.Clear();
          isDigit = char.IsDigit(c);
        }

        sb.Append(c);
      }

      if (sb != null)
        result.Add(sb.ToString());

      return result;
    }

    public StringNaturalComparer(IComparer<string> comparer) {
      m_Comparer = comparer == null ? StringComparer.Ordinal : comparer;
    }

    public int Compare(string left, string right) {
      if (ReferenceEquals(left, right))
        return 0;
      else if (left == null)
        return -1;
      else if (right == null)
        return 1;

      var lefts = ToChunks(left);
      var rights = ToChunks(right);

      int result;

      for (int i = 0; i < Math.Min(lefts.Count, rights.Count); ++i) {
        string leftChunk = lefts[i];
        string rightChunk = rights[i];

        if (char.IsDigit(leftChunk[0]) && char.IsDigit(rightChunk[0])) {
          result = leftChunk.Length.CompareTo(rightChunk.Length);

          if (result != 0)
            return result;
        }

        result = m_Comparer.Compare(leftChunk, rightChunk);

        if (result != 0)
          return result;
      }

      return lefts.Count.CompareTo(rights.Count);
    }
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM