2012-09-13 17 views
13

ile sırala. Int dizilimimi artan sırada sıralamak istiyorum.Bir int dizisini

int[] copyArray = myArray.ToArray(); 

Sonra böyle artan düzende sıralamak istiyorum: İlk

benim dizinin bir kopyasını yapmak

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

Ama hata alıyorum, alır "seçilmiş" highligted ve hatadır: Sen sonunda ToArray() çağırmanız gerekir

+0

SıradakiCopy ile ne yapıyorsunuz? Belki bir diziye ihtiyacın yok. – weston

cevap

32

"örtük '[] int' için 'system.linq.iorderedenumerable' türü dönüştürülemiyor" sıralı diziyi gerçekten bir diziye dönüştürmek için. LINQ tembel değerlendirme kullanır, yani ToArray(), ToList() veya benzeri başka bir yöntem çağrılana kadar ara işlem (bu durumda sıralama) gerçekleştirilmez.

Bunu yapmak zaten öğelerin bir kopyasını oluşturacaktır, bu nedenle önce kendi kopyanızı oluşturmanız gerekmez.

Örnek:

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

Belki ifade söz diziminde bunu yazmak tercih olacaktır:

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

Çok teşekkür ederim, Bay Jon! :) "(i => i)" ne anlama geliyor? – user1635406

+9

@ user1635406: 'i => i * bir lambda işlevidir *; dizinin nasıl sıralanacağını açıklar. Birincisi 'i',' i' isimli bir argüman alması gerektiği anlamına gelir (herhangi bir yasal ismi seçebilirsiniz); Bu argüman bir 'int'dir, çünkü dizi içerdiği şey budur. İkinci kısım, sıralamak istediğiniz miktardır.Bu durumda, her bir sayıyı "kendi" olarak sıralamak istiyoruz, bu yüzden 'i => i'. Marc'ın cevabındaki 'x => x.Adı '," x.Name "ile sıralanan" x "öğelerinin her biri için" anlamındadır. – Jon

+0

İlk önce dizi yapmak ve sipariş etmek için daha hızlı işlem yapmaz mı? –

1

Biz bir sonraki ne yaptığını bilmiyorum, ama belki gerek yok bir dizi. Başka bir linq ifadesine veya foreach'a giriyorsa, sadece en az var'u kullanarak olduğu gibi bırakın.

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

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

Bu, linq'in olabildiğince tembel olmasını sağlar. Her zaman ToArray veya ToList'u kullanırsanız, o zaman oradan değerlendirme yapmaktan başka bir seçeneği yoktur ve sonuç için bellek ayırır.

14

Not: Kopya gerekmiyorsa (yani o myArray değiştirmek kabul edilebilir), sonra da çok daha basit ve daha verimli bir yaklaşım adildir:

Array.Sort(myArray); 

Bu bir yerinde tür yapar dizi, olabildiğince verimli olması için bir dizi olduğu gerçeğini kullanarak.

var sortedCopy = entityArray.OrderBy(x => x.Name).ToArray(); 
: Bu ahlaki-eşdeğerdir

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

: Daha karmaşık senaryolar için

(örneğin, bir nesne dizisinin üyesi-bilge sıralama) kullanarak, gibi şeyler yapabilirsiniz

fakat tekrar: yerinde sıralama yapıyor.

+0

ismini fark etmeliydi Teşekkür ederim, ama bu sefer bir kopyasına ihtiyacım vardı. Gerçi okumaya rağmen. :) – user1635406

İlgili konular