【发布时间】:2023-03-26 22:46:01
【问题描述】:
我有一个数组:
int[] months = new int[4] {1, 4, 7, 10};
我想从给定值开始对数组进行排序,然后按原始顺序对数组的其余部分进行排序。
假设我想开始按值7 对数组进行排序。排序后的数组将按以下顺序排列:
7, 10, 1, 4
或者从值4 开始,排序后的数组将是4, 7, 10, 1
【问题讨论】:
我有一个数组:
int[] months = new int[4] {1, 4, 7, 10};
我想从给定值开始对数组进行排序,然后按原始顺序对数组的其余部分进行排序。
假设我想开始按值7 对数组进行排序。排序后的数组将按以下顺序排列:
7, 10, 1, 4
或者从值4 开始,排序后的数组将是4, 7, 10, 1
【问题讨论】:
怎么样:
var orderedMonths = months.Where(x => x >= 7)
.OrderBy(x => x)
.Concat(months.Where(x => x < 7));
请注意,这意味着“数组的其余部分”的元素将按出现顺序排列,而不是按数字递增顺序排列。如果您的意思是后者(即对两个“段”进行数字排序),我会这样做:
var orderedMonths = months.OrderBy(x => x < 7) // false comes before true
.ThenBy(x => x);
另一方面,如果您想按出现顺序对这两个片段进行排序,我会这样做:
var orderedMonths = months.GroupBy(x => x < 7)
.OrderBy(group => group)
.SelectMany(x => x);
(或)
var orderedMonths = months.Where(x => x >= 7)
.Concat(months.Where(x => x < 7));
【讨论】:
int[] 是IEnumerable<int>。然后编译器将在 Enumerable 类中的 IEnumerable<T> 上使用 LINQ to Objects 扩展方法。
value 提供的,而是由 @987654330 完成的@ 数组中的那个值。换句话说,通过>=7 选择的东西是不正确的。
假设这是你可以排序的 int 数组
int[] months = new int[4] { 1, 4, 7, 10 };
int value = 10;
int[] chk1 = new int[4];
chk1 = months.SkipWhile(a => a != value).
Concat(months.TakeWhile(a => a != value)).ToArray();
这应该会为您提供所需的订单
【讨论】:
你可以使用列表吗?
int NumberToBeFound = 7;
int IndexOfNumber = -1;
for(int i=0;i<months.count;i++){
if(months[i] == NumberToBeFound){
IndexOfNumber = i;
break;
}
}
List<int> Sorted = new List<int>();
for(int i = IndexOfNumber; i < months.count;i++){
Sorted.Add(months[i]);
}
for(int i = 0; i < IndexOfNumber; i++){
Sorted.Add(months[i]);
}
months = Sorted.ToArray();
【讨论】: