C#按索引重新排序数组,甚至是递增的奇数降序

时间:2015-11-30 12:19:24

标签: c# arrays

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

例如,假设我有一个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

3 个答案:

答案 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(); 
相关问题