C#按索引偶数升序奇数降序重新排列数组

本文关键字:新排列 排列 数组 降序 索引 升序 | 更新日期: 2023-09-27 18:24:59

我需要通过每次跳过一个元素来重新排序数组,首先将索引均匀的元素升序排列,然后将索引奇怪的元素降序排列。

例如,假设我有一个double数组,其顺序如下:

[0,0.3,0.7,1.1,1.5,1.9,2.3,2.7,3.1,3.5,3.9]

我想这样订购:

[0,0.7,1.5,2.3,3.1,3.9,3.5,2.7,1.9,1.1,0.3]

正如您所看到的,我对按值排序不感兴趣,只对元素的索引感兴趣。找不到Array.Sort或IEnumerable<>的重载。OrderBy给出了索引,所以我似乎不能使用它。

问这样一个看似简单的问题,我感到有点惭愧,但我不知道如何优雅地做到这一点。我当然可以用foreach循环和索引来完成,但我正在"翻译"一些Matlab代码,这个特定的部分是用一个优雅的(尽管如果你不习惯这种事情,很难理解)一行代码制作的:

y = y([1:2:n 2 * floor(n / 2):-2:2],:); % n being the number of elements in the array y

C#按索引偶数升序奇数降序重新排列数组

此代码将采用数组的其他元素:

var firstHalf = a.Where((value, index) => index % 2 == 0);

一个简单的修改就会得到另一组:

var secondHalf = a.Where((value, index) => index % 2 == 1).Reverse();

然后你可以将两者结合起来:

var result = firstHalf.Concat(secondHalf);

您可以使用linq获取所有奇数和偶数索引,比如:

double[] ar = new double[]{0, 0.3, 0.7, 1.1, 1.5, 1.9, 2.3, 2.7, 3.1, 3.5, 3.9};
var odds = ar.Where((val, index) => index % 2 != 0);
var evens = ar.Where((val, index) => index % 2 == 0);

然后反转赔率并组合两个

由于优雅是主观的,我建议您这样做:

double [] elements = {0, 0.3, 0.7, 1.1, 1.5, 1.9, 2.3, 2.7, 3.1, 3.5, 3.9};
double [] result = elements
             .Select((value, index) => new {Index = index, Value = value})
             .OrderBy(a => a.Index % 2)
             .ThenBy(a => (a.Index % 2 == 0 ? 1 : -1) * a.Value)
             .Select(a => a.Value).ToArray();