我有一个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();
答案 0 :(得分:5)
您当前的代码有两个问题:
startValue
,而不是值本身(“升序”部分)false
在true
之前被订购,因此您需要取消条件这是一个很好的例子:
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();