Подтвердить что ты не робот

Сортировка массива int с помощью orderby

Я хотел бы отсортировать массив int в порядке возрастания.

сначала создаю копию моего массива:

int[] copyArray = myArray.ToArray();

Затем я хотел бы отсортировать его в порядке возрастания следующим образом:

 int[] sortedCopy = from element in copyArray 
                    orderby element ascending select element;

Но я получаю сообщение об ошибке, "selected" получает highligted и ошибка: "не может неявно преобразовать тип 'system.linq.iorderedenumerable' в 'int []'"

4b9b3361

Ответ 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, тогда у него нет выбора, кроме как оценить тогда и там, и выделить память для результата.