【问题标题】:C# Reordering array by index even ascending odd descendingC#按索引重新排序数组偶数升序奇数降序
【发布时间】:2015-11-30 12:19:23
【问题描述】:

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

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


    【解决方案1】:

    此代码将获取数组的所有其他元素:

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

    简单的修改会得到另一套:

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

    那么你可以将两者结合起来:

    var result = firstHalf.Concat(secondHalf);
    

    【讨论】:

    • 是的,我是个白痴 :) 我确实想得太远了,尝试使用 GroupBy 之类的东西。很好的解决方案。
    【解决方案2】:

    您可以像这样使用 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);
    

    然后反转赔率并将两者结合起来

    【讨论】:

      【解决方案3】:

      优雅是主观的,我建议你这样做:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 2018-05-26
        相关资源
        最近更新 更多