C#Linq-按ASC顺序从VALUE开始

时间:2019-03-05 20:26:19

标签: c# linq

我有一个int数组,我想按从某个值开始的升序对它们进行排序,我们将其称为startValue。但是,我想保留所有值,并且大于startValue的值应在列表中的最大值之后 出现。

使用示例可能更容易解释...

int[] values = new int[] { 1, 2, 4, 6, 9 };
int startValue = 4;
int[] orderedValues = { 4, 6, 9, 1, 2 }; // desired result

我该如何实现?我认为这样可以解决问题,但是新的orderedValues的顺序与原始值相同。

int[] orderedValues = values.OrderBy( v => v >= startValue ).ToArray();

3 个答案:

答案 0 :(得分:5)

您当前的代码有两个问题:

  • 您只能通过 来排序值是否至少为startValue,而不是值本身(“升序”部分)
  • falsetrue之前被订购,因此您需要取消条件

这是一个很好的例子:

using System;
using System.Linq;

class Test
{
    static void Main()
    {
        int[] values = new int[] { 1, 2, 4, 6, 9 };
        int startValue = 4;
        int[] orderedValues = values
            .OrderBy(v => v < startValue) // Note reversed comparison
            .ThenBy(v => v)               // Order by value within each segment
            .ToArray();
        Console.WriteLine(string.Join(", ", orderedValues));
    }
}

答案 1 :(得分:1)

将您的values分成两组,并分别对它们进行排序。之后,您可以使用Concat加入该组。尝试以下代码:

var result = values
    .Where(v => v >= startValue) // filter first group
    .OrderBy(v => v)
    .Concat(
      values.Where(v => v < startValue).OrderBy(v => v) // second group
    )
    .ToArray();

答案 2 :(得分:-1)

 int[] values = new int[] { 1, 2, 4, 6, 9 };
            int startValue = 4;
            int[] orderedValues = { 4, 6, 9, 1, 2 }; 

        var a = from v in values
                where v >= startValue orderby v
                select v;
        orderedValues = a.ToArray();