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
此代码将采用数组的其他元素:
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();