Не спрашивайте, как и почему ... ^^
list.Sort(); // In case the list is not already sorted.
var length = list.Count;
var result = Enumerable.Range(0, length)
.Select(i => length - 1 - 2 * i)
.Select(i => list[Math.Abs(i - (i >> 31))])
.ToList();
Хорошо, прежде чем я забуду, как это работает, здесь вы идете.
Список с 6 пунктами, например, должен быть переупорядочен; самая длинная строка указана в индексе 5, самая короткая - в индексе 0 предварительно отсортированного списка.
5 3 1 0 2 4
Мы начинаем с Enumerable.Range(0, length)
получая
0 1 2 3 4 5
затем применяем i => length - 1 - 2 * i
получая
5 3 1 -1 -3 -5
и у нас есть неотрицательная часть правильно. Теперь обратите внимание, что i >> 31
является арифметическим сдвигом влево и копирует бит знака во все биты. Поэтому неотрицательные числа дают 0, а отрицательные числа - -1. Это, в свою очередь, означает, вычитая i >> 31
не изменится неотрицательные числа, но добавить 1 к отрицательных чисел с получением
5 3 1 0 -2 -4
и теперь мы, наконец, применить Math.Abs()
и получить
5 3 1 0 2 4
, который является желаемым результатом. Он работает аналогично для списков нечетной длины.
Впечатляющий ответ. – chad
Но вы ничего не хотите вводить в производственный код. Или, может быть, только с * лотом * комментариев. –