2012-09-13 80 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