Genel liste DESC ve ASC'yi nasıl sıralayabilirim?


110

Genel liste DESC ve ASC'yi nasıl sıralayabilirim? LINQ ile ve LINQ olmadan? VS2008 kullanıyorum.

class Program
{
    static void Main(string[] args)
    {
        List<int> li = new List<int>();

        li.Add(456);
        li.Add(123);
        li.Add(12345667);
        li.Add(0);
        li.Add(1);

        li.Sort();

        foreach (int item in li)
        {
            Console.WriteLine(item.ToString() + "\n");
        }

        Console.ReadKey();
    }
}

Yanıtlar:


246

Linq ile

var ascendingOrder = li.OrderBy(i => i);
var descendingOrder = li.OrderByDescending(i => i);

Linq olmadan

li.Sort((a, b) => a.CompareTo(b)); // ascending sort
li.Sort((a, b) => b.CompareTo(a)); // descending sort

Linq olmadan listenin kendisinin sıralandığına dikkat edin. Linq ile listenin sıralı bir listesini alıyorsunuz ancak listenin kendisi değişmedi. Listeyi değiştirmek isterseniz, Linq yöntemlerini aşağıdaki gibi değiştirirsiniz:

li = li.OrderBy(i => i).ToList();

1
@onedaywhen Başka bir kullanıcının cevabının yanlış olduğunu düşünüyorsanız, yorum yapmalı, oy vermeli ve / veya doğru olduğunu düşündüğünüz bir cevap vermelisiniz, başka bir kişinin cevabını sizin doğru olduğunu düşündüğünüz gibi düzenlememelisiniz.
Servy

24
Ben azalan için kullanımda çok net olduğunu düşünüyorum li.Sort((a, b) => b.CompareTo(a));daha -1*burada kullanılan yaklaşıma. Cevabı buna göre düzenledim ama @Servy geri aldı.
onedaywhen

9
@onedaywhen Yazar neyi amaçladığını yazarken bir hata yaptığında, onu yazmak istediği gibi değiştirmek iyidir. Başka birinin çözümün olması gerektiğini düşündüğü kod biçimini değiştirmek, bunun yerine kullanılması gerektiğini düşündüğünüz farklı bir yaklaşım kullanmak uygun bir düzenleme değildir.
Servy

5
@onedaywhen Elbette; anlatılan düzenlemeyi gördüğünüz her yerde göreceksiniz. Yardım merkezinden, "Gönderileri ne zaman düzenlemeliyim? [...]
Gönderinin

4
Ya da sadece -a.CompareTo(b).
Shimmy Weitzhandler

72

Linq olmadan:

artan:

li.Sort();

Azalan:

li.Sort();
li.Reverse();

Sort()geçersiz bir yöntemdir, bu nedenle Reverse()onu bu şekilde zincirleyemezsiniz . 2 ayrı işleme ihtiyacınız olacak. Bununla birlikte, LINQ ile bunu bir'e zincirleyebilirsiniz, OrderByancak bu noktada OrderByDescendingbunun yerine kullanmanız gerekir .
Ahmad Mageed


3

Yukarıdaki tüm cevabı kontrol ediyordum ve bir ek bilgi daha eklemek istedim. Listeyi DESC sırasına göre sıralamak istedim ve daha büyük girdiler için daha hızlı olan çözümü arıyordum ve daha önce bu yöntemi kullanıyordum: -

li.Sort();
li.Reverse();

ancak test durumlarım zaman sınırlarını aştığı için başarısız oluyordu, bu nedenle aşağıdaki çözüm benim için çalıştı: -

li.Sort((a, b) => b.CompareTo(a));

Sonuç olarak, sonuç, Listeyi Azalan düzende Sıralama'nın 2. yolunun öncekinden biraz daha hızlı olmasıdır.


-3

Listeyi azalan düzende int değerleriyle sıralamanın çok basit yolu:

li.Sort((a,b)=> b-a);

Bunun yardımcı olacağını umuyoruz!


4
Bu int.CompareTo(int)kapı bir sebep değil. Referenceource.microsoft.com adresindeki kaynağa bakın : " Çok büyük negatif sayılar için çıkarma işlemi pozitif olarak sarılacağı için karşılaştırma kullanılması gerekir. " Eğer sahipseniz b = int.MinValueve a = 1(söylerseniz), bu başarısız olacaktır. Bazen bir yöntem çağrısı buna değer.
Wai Ha Lee

Soru, genel listelerin sıralanması hakkında diyor. "-" işlemi birçok tür için derlenemez bile. Ve derlenmiş türler için, daha önce yorumda belirtildiği gibi sayısal taşma hatası
yaşayabilirsiniz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.