Сортировка массива int с помощью orderby
Я хотел бы отсортировать массив int в порядке возрастания.
сначала создаю копию моего массива:
int[] copyArray = myArray.ToArray();
Затем я хотел бы отсортировать его в порядке возрастания следующим образом:
int[] sortedCopy = from element in copyArray
orderby element ascending select element;
Но я получаю сообщение об ошибке, "selected" получает highligted и ошибка:
"не может неявно преобразовать тип 'system.linq.iorderedenumerable' в 'int []'"
Ответы
Ответ 1
Вам нужно вызвать ToArray()
в конце, чтобы фактически преобразовать упорядоченную последовательность в массив. LINQ использует ленивую оценку, а это означает, что до тех пор, пока вы не вызовете ToArray()
, ToList()
или какой-либо другой подобный метод, промежуточная обработка (в этом случае сортировка) не будет выполнена.
Выполнение этого уже сделает копию элементов, поэтому вам не нужно сначала создавать свою собственную копию.
Пример:
int[] sortedCopy = (from element in myArray orderby element ascending select element)
.ToArray();
Возможно, было бы предпочтительнее записать это в синтаксисе выражений:
int[] sortedCopy = myArray.OrderBy(i => i).ToArray();
Ответ 2
Примечание: если вам не нужна копия (т.е. допустимо изменить myArray
), тогда гораздо более простой и эффективный подход:
Array.Sort(myArray);
Это делает массив на месте, используя тот факт, что это массив как можно более эффективный.
Для более сложных сценариев (например, тип объектов-массива, относящихся к элементам) вы можете делать такие вещи, как:
Array.Sort(entityArray, (x,y) => string.Compare(x.Name, y.Name));
это моральный эквивалент:
var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray();
но опять же: выполните сортировку на месте.
Ответ 3
Мы не знаем, что вы делаете дальше, но, возможно, вам не нужен массив. Если он входит в другой оператор linq или foreach, то просто сохраните его как есть, проще всего используя var
.
var sortedCopy = myArray.OrderBy(i => i);
foreach(var item in sortedCopy)
{
//print out for example
}
Это позволяет linq быть как можно более ленивым. Если вы всегда используете ToArray
или ToList
, тогда у него нет выбора, кроме как оценить тогда и там, и выделить память для результата.