Получение всех папок в определенном порядке - PullRequest
5 голосов
/ 20 октября 2010

У меня есть список папок, упорядоченных по base36 (0-9, затем a-z). Теперь моя текущая реализация для их чтения - перебирать число, преобразовывать его в base32, проверять, существует ли папка. Если он действительно читает данные, если он не заканчивается.

Проблема в том, что в номерах папок есть пробелы. Пример: 0,1,2,4,5,6,8, а, б, в, г, к, р

Каков наилучший способ перебора всех их в правильном порядке (учитывая, что может быть любое количество папок)?

(Примечание: я не могу просто получить все каталоги, потому что они будут упорядочены в алфавитном порядке. Например, 2A будет расположен перед z)

Ответы [ 3 ]

5 голосов
/ 20 октября 2010

Я бы, вероятно, поместил бы все каталоги в память, а затем отсортировал их, а не пытался бы создать что-то, что угадывало бы все возможные значения по порядку.

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 голосов
/ 20 октября 2010

Это по сути радикальная сортировка имен папок. Сначала отсортируйте их по алфавиту, а затем по длине строки.

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
1 голос
/ 20 октября 2010

Попробуйте, чтобы привести их в порядок:

List<string> b36Items = new List<string>;
//Load with base 36 strings;

List<string> sortedItems = b36Items.OrderBy( t=> Convert.ToInt32(t,36)).ToList();

Документация для Convert.ToInt32 (строка, основание) здесь .

UPDATE

Как отметил @Philip Rieck, это не будет работать с базой 36, так как самая высокая база, с которой работает эта функция - 16. Я оставлю это для других людей, у которых есть подобная проблема с меньшей базой, но вам лучше используя одно из других решений. Жаль, потому что это было бы довольно гладко ...

...