2012-09-13 53 views
13

我想按升序排列我的int数组。用order排序int数组

第一我让我的数组的一个副本:

int[] copyArray = myArray.ToArray(); 

那么我想它按升序这样的排序:

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

但我得到一个错误,“选择”被highligted和错误是: “不能隐式地将类型'system.linq.iorderedenumerable'转换为'int []'”

+0

接下来你在用sortedCopy做什么?也许你不需要一个数组。 – weston

回答

32

您需要在末尾调用ToArray()实际上将有序序列转换为数组。 LINQ使用懒惰评估,这意味着直到您拨打ToArray(),ToList()或其他类似的方法,中间处理(在这种情况下排序)将不会执行。

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

例子:

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

这或许会是最好的表达语法来写:

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

非常感谢Jon先生! :) “(i => i)”是什么意思? – user1635406

+9

@ user1635406:'i => i'是一个* lambda函数*;它描述了如何对数组进行排序。第一个“i”表示它需要一个名为'i'的参数(可以选择任何合法名称);这个参数是一个'int',因为这就是数组包含的内容。第二部分是你想要排序的数量。在这种情况下,我们希望将每个数字排序为“自己”,所以'i => i'。 Marc的答案中的'x => x.Name'将意味着“给定每个元素'x',按'x.Name'排序。 – Jon

+0

如果你先进行数组,然后点击排序,它不会更快处理吗? –

1

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

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

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

这使得linq尽可能的懒惰。如果您始终投了ToArrayToList,那么它没有别的办法,只能在那里评估,然后为结果分配内存。

14

注意:如果你不需要一个副本(即,它是可以接受的改变myArray),然后是更简单,更有效的方法就是:

Array.Sort(myArray); 

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

对于更复杂的场景(例如,一个对象的阵列的构件明智排序),可以做这样的事情:

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

这是道德当量:

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

但是再次:在原地进行排序。

+0

谢谢,但这一次我需要一个副本。虽然有趣的阅读。 :) – user1635406