使用orderby对int数组进行排序

我想按升序排序我的int数组。

首先我复制一下我的数组:

int[] copyArray = myArray.ToArray(); 

然后我想按升序排序,如下所示:

  int[] sortedCopy = from element in copyArray orderby element ascending select element; 

但是我得到一个错误,“选中”得到了高位,错误是:“不能隐式地将类型’system.linq.iorderedenumerable’转换为’int []’”

您需要在最后调用ToArray()以实际将有序序列转换为数组。 LINQ使用延迟评估 ,这意味着在调用ToArray()ToList()或其他类似方法之前,不会执行中间处理(在本例中为排序)。

这样做已经复制了元素,因此您实际上不需要先创建自己的副本。

例:

 int[] sortedCopy = (from element in myArray orderby element ascending select element) .ToArray(); 

在表达式语法中写这个可能更好:

 int[] sortedCopy = myArray.OrderBy(i => i).ToArray(); 

注意:如果您不需要副本(即可以更改myArray ),那么更简单,更有效的方法就是:

 Array.Sort(myArray); 

这会对数组进行就地排序,利用它是一个尽可能高效的数组这一事实。

对于更复杂的场景(例如,成员级的对象arrays),您可以执行以下操作:

 Array.Sort(entityArray, (x,y) => string.Compare(x.Name, y.Name)); 

这是道德等同于:

 var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray(); 

但又一次:就地进行排序。

我们不知道你接下来在做什么,但也许你不需要一个数组。 如果它进入另一个linq语句或foreach,那么只需保持原样,最简单的方法就是使用var

 var sortedCopy = myArray.OrderBy(i => i); foreach(var item in sortedCopy) { //print out for example } 

这允许linq尽可能地懒惰。 如果你总是ToArrayToList那么除了评估那里和那里之外别无选择,并为结果分配内存。