代码之家  ›  专栏  ›  技术社区  ›  Blam

按特定顺序获取所有文件夹

  •  5
  • Blam  · 技术社区  · 14 年前

    我有一个按base36(0-9然后a-z)组织的文件夹列表。现在,我读取它们的当前实现是遍历一个数字,将其转换为base32,检查文件夹是否存在。如果它不结束就读取数据。

    这里的问题是文件夹的号码有空白。例:0,1,2,4,5,6,8,a,b,c,g,k,p

    任何 文件夹数量?

    (注意:我不能简单地得到所有的目录,因为它们是按字母顺序排列的。例如,2A将放在z之前)

    3 回复  |  直到 14 年前
        1
  •  3
  •   Austin Salonen gmlacrosse    14 年前

    这实际上是对文件夹名的基数排序。首先按字母顺序对它们进行排序,然后按字符串的长度进行排序。

    var names = new[] {"4cc", "2a", "0", "z", "1ab"};
    
    foreach (var n in names.OrderBy(x => x).OrderBy(y => y.Length)) 
    {
        Console.WriteLine(n);
    }
    

    产量:

    0
    z
    2a
    1ab
    4cc
    
        2
  •  5
  •   Philip Rieck    14 年前

    var names = GetAllDirectoryNames();
    names.Sort(CompareNames);
    foreach( var name in Names)
    {
      DoSomethingWithDir(name);
    }
    
    //...
    
    private static int CompareNames(string x, string y)
    {
      if( x == null && y == null) return 0;
      if( x== null) return -1;
      if( y == null) return 1;
    
      var xVal = Base36Decode(x);
      var yVal = Base36Decode(y);
      if( xVal > yVal) return 1;
      if( xVal < yVal) return -1;
      return 0;
    }
    
    private long Base36Decode(string inputString)
    {
        var charList = "0123456789abcdefghijklmnopqrstuvwxyz";
    
        inputString = Reverse(inputString.ToLower());
        long result = 0;
        int position = 0;
        foreach (char c in inputString)
        {
            result += charList.IndexOf(c) * (long)Math.Pow(36, position);
            position++;
        }
        return result;
    }
    
        3
  •  1
  •   Raphaël Saint-Pierre    14 年前

    试着按顺序排列:

    List<string> b36Items = new List<string>;
    //Load with base 36 strings;
    
    List<string> sortedItems = b36Items.OrderBy( t=> Convert.ToInt32(t,36)).ToList();
    

    文件 Convert.ToInt32(string, base) here .

    更新