2015-11-30 31 views
1

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

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

回答

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); 
+0

是的,我是一个白痴:)我肯定想太多了,尝试与GroupBy和ST UFF。好的解决方案 – Gimly

1

你可以得到所有的奇数和偶数使用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); 

然后反转的可能性,并结合两种

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();