我需要通过每次跳过一个元素来重新排序数组,首先将均匀索引的元素升序,然后按降序排列奇数索引元素。
例如,假设我有一个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
答案 0 :(得分:6)
此代码将采用数组的其他所有元素:
var firstHalf = a.Where((value, index) => index % 2 == 0);
一个简单的修改将获得另一组:
var secondHalf = a.Where((value, index) => index % 2 == 1).Reverse();
然后你可以将两者结合起来:
var result = firstHalf.Concat(secondHalf);
答案 1 :(得分:1)
您可以使用linq获取所有奇数和偶数索引,如下所示:
Class
然后反转赔率并合并两个
答案 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();