使用orderby对int数组进行排序

use*_*406 23 c#

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

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

int[] copyArray = myArray.ToArray();
Run Code Online (Sandbox Code Playgroud)

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

 int[] sortedCopy = from element in copyArray 
                    orderby element ascending select element;
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*Jon 47

您需要ToArray()在最后调用实际将有序序列转换为数组.LINQ使用惰性计算,这意味着,直到调用ToArray(),ToList()或一些其他类似的方法在中间处理(在这种情况下分选)将不被执行.

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

例:

int[] sortedCopy = (from element in myArray orderby element ascending select element)
                   .ToArray();
Run Code Online (Sandbox Code Playgroud)

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

int[] sortedCopy = myArray.OrderBy(i => i).ToArray();
Run Code Online (Sandbox Code Playgroud)

  • @ user1635406:`i => i`是*lambda函数*; 它描述了如何对数组进行排序.第一个`i`意味着它需要一个名为`i`的参数(你可以选择任何合法的名字); 这个参数是一个`int`,因为这是数组包含的内容.第二部分是您要排序的数量.在这种情况下,我们想要将每个数字"自身"排序,因此`i => i`.Marc的答案中的`x => x.Name`意味着"给定每个元素`x`,按'x.Name`排序". (9认同)

Mar*_*ell 20

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

Array.Sort(myArray);
Run Code Online (Sandbox Code Playgroud)

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

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

Array.Sort(entityArray, (x,y) => string.Compare(x.Name, y.Name));
Run Code Online (Sandbox Code Playgroud)

这是道德等同于:

var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray();
Run Code Online (Sandbox Code Playgroud)

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