使用orderby对int数组进行排序

时间:2012-09-13 10:59:28

标签: c#

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

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

int[] copyArray = myArray.ToArray();

然后我想按照这样的升序排序:

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

但是我收到错误,“选中”得到了高位,错误是: “无法将类型'system.linq.iorderedenumerable'隐式转换为'int []'”

3 个答案:

答案 0 :(得分:43)

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

执行此操作已经复制了元素,因此您实际上不需要先创建自己的副本。

示例:

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

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

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

答案 1 :(得分:19)

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

Array.Sort(myArray);

这是一个就地排列的数组,利用它是一个尽可能高效的数组这一事实。

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

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

这是道德等同于:

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

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

答案 2 :(得分:1)

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

var sortedCopy = myArray.OrderBy(i => i);

foreach(var item in sortedCopy)
{
   //print out for example
}

这允许linq尽可能地懒惰。如果你总是强制转换ToArrayToList,那么它别无选择,只能在那里进行评估,并为结果分配内存。