2012-09-13 10 views
13

Chciałbym posortować tablicę int w porządku rosnącym.Sortuj tablicę int z zamówieniem przez

najpierw robię kopię mojej tablicy:

int[] copyArray = myArray.ToArray(); 

to chciałbym uporządkować je w kolejności rosnącej tak:

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

Ale pojawia się błąd „wybrany” zostaje highligted i błąd: "nie można niejawnie przekonwertować typu" system.linq.iorderedenumerable "na 'int []'"

+0

Co robisz dalej z sortedCopy? Może nie potrzebujesz tablicy. – weston

Odpowiedz

32

Musisz zadzwonić pod numer ToArray() na końcu faktycznie przekształcić uporządkowaną sekwencję w tablicę. LINQ używa leniwej oceny, co oznacza, że ​​dopóki nie zadzwonisz pod numer ToArray(), ToList() lub jakiejś innej podobnej metody, przetwarzanie pośrednie (w tym przypadku sortowanie) nie zostanie wykonane.

Wykonanie tej czynności spowoduje wykonanie kopii elementów, więc nie trzeba najpierw tworzyć własnej kopii.

Przykład:

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

To może być korzystne, aby napisać to w składni wyrażeń:

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

Bardzo dziękuję panu Jonowi! :) Co oznacza "(i => i)"? – user1635406

+9

@ user1635406: 'i => i' jest funkcją * lambda *; opisuje sposób sortowania tablicy. Pierwsze "i" oznacza, że ​​przyjmuje jeden argument o nazwie "i" (można wybrać dowolną nazwę prawną); ten argument jest "int", ponieważ właśnie to zawiera tablica. Druga część to ilość, którą chcesz posortować według.W tym przypadku chcemy posortować każdy numer "jako taki", więc 'i => i'. "X => x.Name" w odpowiedzi Marca oznaczałoby "dany element x", sortuj według 'x.Nazwa'". – Jon

+0

nie będzie szybciej przetwarzać, jeśli najpierw zrobisz to w tablicy, a następnie złożysz zamówienie? –

1

Nie wiemy, co robisz dalej, ale może nie trzeba tablica. Jeśli przechodzi do innej instrukcji linq lub foreach, po prostu zachowaj ją w niezmienionej postaci, najprościej używając var.

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

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

Dzięki temu linq może być tak leniwy, jak to tylko możliwe. Jeśli zawsze odlewasz ToArray lub ToList, to nie masz wyboru, jak ocenić wtedy i tam, i przydzielić pamięć dla wyniku.

14

Uwaga: jeśli nie trzeba kopię (tj dopuszczalne jest, aby zmienić myArray), wtedy o wiele prostsze i bardziej efektywne podejście jest po prostu:

Array.Sort(myArray); 

to robi się coś w rodzaju w miejscu o tablica, wykorzystując fakt, że jest to tablica, aby była jak najbardziej efektywna.

Dla bardziej złożonych scenariuszy (na przykład rodzaj członkiem mądry obiektu array), można robić takie rzeczy jak:

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

to moralno-odpowiednik:

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

ale znowu: robienie sortowania w miejscu.

+0

Dziękuję, ale tym razem potrzebowałem kopii. Ciekawa lektura. :) – user1635406

Powiązane problemy