25

我想按升序对我的 int 数组进行排序。

首先我复制我的数组:

int[] copyArray = myArray.ToArray();

然后我想按升序对它进行排序,如下所示:

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

但我收到一个错误,“选定”被高亮显示,错误是:“无法将类型'system.linq.iorderedenumerable'隐式转换为'int []'”

4

3 回答 3

55

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

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

例子:

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

最好用表达式语法来写:

int[] sortedCopy = myArray.OrderBy(i => i).ToArray();
于 2012-09-13T11:00:48.337 回答
24

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

Array.Sort(myArray);

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

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

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

这是道德等价的:

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

但同样:就地进行排序。

于 2012-09-13T11:10:55.913 回答
2

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

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

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

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

于 2012-09-13T11:10:48.783 回答