Bagaimana cara mengurutkan DESC daftar generik dan ASC?

110

Bagaimana cara mengurutkan DESC daftar generik dan ASC? Dengan LINQ dan tanpa LINQ? Saya menggunakan VS2008.

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();
    }
}
Penguen
sumber

Jawaban:

246

Dengan Linq

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

Tanpa Linq

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

Perhatikan bahwa tanpa Linq, daftar itu sendiri sedang diurutkan. Dengan Linq, Anda mendapatkan daftar yang dapat dihitung jumlahnya tetapi daftarnya sendiri tidak berubah. Jika Anda ingin mengubah daftar, Anda akan mengubah metode Linq menjadi seperti

li = li.OrderBy(i => i).ToList();
Anthony Pegram
sumber
1
@onedaywhen Jika Anda merasa jawaban pengguna lain salah, Anda harus memberikan komentar, voting, dan / atau memberikan jawaban yang Anda rasa benar, tidak mengedit jawaban orang lain menjadi jawaban yang menurut Anda benar.
Pelayanan
24
Saya pikir untuk urutan menurun itu jauh lebih jelas untuk digunakan li.Sort((a, b) => b.CompareTo(a));daripada -1*pendekatan yang digunakan di sini. Saya mengedit jawabannya sesuai tetapi @Servy mengembalikannya.
onedaywhen
9
@onedaywhen Ketika penulis membuat kesalahan dalam menuliskan apa yang mereka maksudkan, mengubahnya menjadi apa yang mereka ingin tulis tidak masalah. Mengubah bentuk kode yang menurut orang lain merupakan solusi yang seharusnya menggunakan pendekatan berbeda yang menurut Anda harus digunakan bukanlah pengeditan yang sesuai.
Pelayanan
5
@onedaywhen Tentu; Anda akan melihatnya di mana pun Anda melihat pengeditan dijelaskan. Dari pusat bantuan, "Kapan saya harus mengedit postingan? [...] Untuk memperjelas arti postingan (tanpa mengubah arti)"
Layanan
4
Atau hanya -a.CompareTo(b).
Shimmy Weitzhandler
72

Tanpa Linq:

Menaik:

li.Sort();

Menurun:

li.Sort();
li.Reverse();
Sani Singh Huttunen
sumber
Sort()adalah metode kosong, jadi Anda tidak dapat menghubungkannya Reverse()dengan cara ini. Anda akan membutuhkan 2 operasi terpisah. Namun, dengan LINQ Anda dapat menghubungkannya ke sebuah OrderBytetapi pada saat itu Anda sebaiknya menggunakan OrderByDescendingsaja.
Ahmad Mageed
20

tanpa LINQ, gunakan Sort()dan kemudian Reverse().

Srinivas Reddy Thatiparthy
sumber
3

Saya sedang memeriksa semua jawaban di atas dan ingin menambahkan satu informasi tambahan lagi. Saya ingin mengurutkan daftar dalam urutan DESC dan saya sedang mencari solusi yang lebih cepat untuk input yang lebih besar dan saya menggunakan metode ini sebelumnya: -

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

tetapi kasus pengujian saya gagal karena melebihi batas waktu, jadi solusi di bawah ini berhasil untuk saya: -

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

Jadi kesimpulannya adalah cara ke-2 dari Sorting list dengan Descending order sedikit lebih cepat dari yang sebelumnya.

sarawgeek
sumber
-3

Cara yang sangat sederhana untuk mengurutkan Daftar dengan nilai int dalam urutan menurun:

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

Semoga ini membantu!

Sunil Murali
sumber
4
Ini bukanlah int.CompareTo(int)alasan mengapa pintu. Lihat sumber di referenceource.microsoft.com yang mengatakan: " Perlu menggunakan bandingkan karena pengurangan akan membungkus menjadi positif untuk bilangan negatif yang sangat besar, dll .". Jika Anda memiliki b = int.MinValuedan a = 1(katakanlah), ini akan gagal. Terkadang panggilan metode sangat berharga.
Wai Ha Lee
Pertanyaan tentang pengurutan daftar umum. Operasi "-" bahkan tidak dapat dikompilasi untuk banyak tipe. Dan untuk kumpulan tipe yang dikompilasi Anda dapat mengalami kesalahan luapan numerik seperti yang disebutkan dalam komentar sebelumnya
Vadim Levkovsky