2016-04-06 4 views
1

Я пытаюсь разобраться следующий список List<char[]> permutations = new List<char[]>();C# Список Сортировать по массивы символов с помощью LINQ

содержит все перестановки числа 0,1,2,3,4,5,6,7, 8,9, однако они не отсортированы, но они мне нужны. Это то, что я сделал, чтобы исправить мою проблему:

 permutations = permutations.OrderBy(arr1 => arr1[9]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[8]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[7]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[6]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[5]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[4]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[3]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[2]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[1]).ToList(); 
     permutations = permutations.OrderBy(arr1 => arr1[0]).ToList(); 

как я могу избежать этого и как это может быть записано в 1 строке?

ответ

3

Сначала я хотел бы отметить, что вы повторно сортируете список 9 раз.

собственно способ цепи порядками является использование ThenBy (обратите внимание, что порядок сравнения сторнируется, чтобы получить результаты, чтобы заказать в той же манере, что у вас есть сейчас):

permutations = permutations.OrderBy(arr1 => arr1[0]) 
           .ThenBy(arr1 => arr1[1]) 
           .ThenBy(arr1 => arr1[2]) 
           .ThenBy(arr1 => arr1[3]) 
           .ThenBy(arr1 => arr1[4]) 
           .ThenBy(arr1 => arr1[5]) 
           .ThenBy(arr1 => arr1[6]) 
           .ThenBy(arr1 => arr1[7]) 
           .ThenBy(arr1 => arr1[8]) 
           .ThenBy(arr1 => arr1[9]).ToList(); 

Один простой способ уменьшить количество кода является

permutations = permutations.OrderBy(a => new string(a)).ToList(); 

Или просто упорядочить список на месте.

permutations.Sort((a1, a2) => (new string(a)).CompareTo(new string(a2))); 

Предоставленные те генерирует много строк, но следующий лучший вариант, чтобы написать IComparer<char[]>, которая сравнивает два символьных массив так, как вы хотите. Еще один вариант (так как я знаю, что список массивов символов возник из другого вопроса), так что сохраните перестановки как строки вместо массивы. Тогда сортировка не легкая задача:

permutations.Sort(); 
+0

Отличный ответ. Всего несколько заметок: OrderBy (a => новая строка (a)). ToList() && .Sort ((a1, a2) => (новая строка (a1)). CompareTo (новая строка (a2))); действительно медленны в производительности по сравнению с методом .ThenBy, также являются перестановками. Sort(); не работают, если мы используем символы, поскольку мы не предоставляем IComparer. Первый из них почти в 4 раза быстрее второго и третьего – KOPEUE

+1

1) Вот почему я сказал, что это способ уменьшить _code_. Я не удивлен, что это медленнее только из-за объема памяти, выделенной для этих строк. Независимо от того, является ли это _problem_, зависит от общей производительности системы. –

+1

2) Если вы сохранили строки вместо массивов символов, вам не нужно будет передавать сравнение с 'Sort' - он будет сортировать строки по алфавиту по умолчанию. Он не работает для массивов символов, поскольку для массивов символов не существует сопоставления по умолчанию. –

0

Просто используйте string вместо char[] который в основном IEnumerable<char> Таким образом, вы можете просто написать

permutations.Sort(); 

если вы хотите сохранить это ваш путь вы можете цепи ваши выражения:

permutations = permutations.OrderBy(arr1 => arr1[9]) 
    .ThenBy(arr1 => arr1[8]) 
    .ThenBy(arr1 => arr1[7]) 
    .ThenBy(arr1 => arr1[6]) 
    .ThenBy(arr1 => arr1[5]) 
    .ThenBy(arr1 => arr1[4]) 
    .ThenBy(arr1 => arr1[3]) 
    .ThenBy(arr1 => arr1[2]) 
    .ThenBy(arr1 => arr1[1]) 
    .ThenBy(arr1 => arr1[0]) 
    .ToList(); 
0

Это довольно старый, но я работал над этим и имею решение, которое предлагается в комментариях, но не показан. Как было предложено George, динамический способ справиться с этим состоит в использовании цикла for, но есть один полученный, как указано здесь OrderBy/ThenBy in Loop.

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

var p = permutations.OrderBy(x => x[0]); 
for (int i = 1; i < s.Length; i++) 
{ 
    var index = i; //Must do this to Avoid Gotcha 
    p = p.ThenBy(x => x[index]); 
} 
permutations = p.ToList(); 
Смежные вопросы