Perhatikan bagaimana Anda dapat menggunakan nama yang sama setiap saat. Ini juga setara dengan:
tmp =from o in invoices.InvoiceCollectionorderby o.InvoiceOwner.LastName,
o.InvoiceOwner.FirstName,
o.InvoiceIDselect o;
Jika Anda menelepon OrderBybeberapa kali, itu akan secara efektif menyusun ulang urutan seluruhnya tiga kali ... jadi panggilan terakhir secara efektif akan menjadi yang dominan. Anda dapat (dalam LINQ ke Objek) menulis
foo.OrderBy(x).OrderBy(y).OrderBy(z)
yang setara dengan
foo.OrderBy(z).ThenBy(y).ThenBy(x)
karena urutan sortirnya stabil, tetapi Anda sama sekali tidak boleh:
Sulit untuk dibaca
Tidak bekerja dengan baik (karena menyusun ulang seluruh urutan)
Ini mungkin tidak berfungsi di penyedia lain (misalnya LINQ ke SQL)
Ini pada dasarnya bukan bagaimana OrderBydirancang untuk digunakan.
Intinya OrderByadalah untuk memberikan proyeksi pemesanan yang "paling penting"; kemudian gunakan ThenBy(berulang kali) untuk menentukan proyeksi urutan sekunder, tersier, dll.
Secara efektif, pikirkan seperti ini: OrderBy(...).ThenBy(...).ThenBy(...)memungkinkan Anda membuat perbandingan gabungan tunggal untuk dua objek, lalu mengurutkan urutan sekali menggunakan perbandingan gabungan tersebut. Hampir pasti itulah yang Anda inginkan.
Itulah yang saya pikirkan tetapi, untuk beberapa alasan OrderBy, ThenBy, ThenBy tampaknya tidak menyortir dengan benar jadi saya bertanya-tanya apakah saya menggunakannya dengan benar.
DazManCat
14
Perhatikan bahwa dalam sintaks kueri, kata kunci untuk pengurutan sebenarnya adalah orderby, bukan urut. ( maaf untuk kelayakannya - hanya ingin mengatakan saya pernah mengoreksi posting Jon Skeet )
fostandy
1
Jon, ada sesuatu yang tidak cocok untuk saya dari bagian tetapi Anda sama sekali tidak boleh (yang berhubungan dengan menerapkan beberapa urutan dengan menggunakan sintaks linq fluent karena diterjemahkan ke ThenBy, dalam kueri lokal): Tidak berkinerja baik (karena itu menyusun ulang seluruh urutan) - maksud Anda urutan ke-2 atau ke-3 dengan menyusun ulang seluruh urutan? jika demikian, bagaimana ini akan tetap diterjemahkan ke ThenBy setelah mengurutkan ulang urutan membuang pengurutan sebelumnya?
Veverke
@Veverke: Ini mengurutkan ulang seluruh urutan, tetapi dengan cara yang stabil, jadi jika dua nilai memiliki nilai z yang sama, urutannya akan bergantung pada y dan kemudian pada x.
Jon Skeet
1
@Veverke: OrderBy(a).OrderBy(b).OrderBy(c)masih menggunakan keluaran dari pengurutan sebelumnya, dan menyusun ulang semuanya, tetapi mempertahankan urutan yang ada (dari langkah sebelumnya) di mana dua elemen sama di bawah perbandingan baru. Bayangkan kita baru saja OrderBy(a).OrderBy(b). Hasil dari OrderBy(a)berada di aurutan yang meningkat , dan kemudian diurutkan kembali sesuai dengan b. Pada hasil akhir, jika dua nilai memiliki nilai yang sama b, mereka akan diurutkan berdasarkan akarena pengurutannya stabil - jadi setara dengan OrderBy(b).ThenBy(a).
Jon Skeet
2
Saya menemukan perbedaan ini menjengkelkan saat mencoba membangun kueri secara umum, jadi saya membuat sedikit bantuan untuk menghasilkan OrderBy / ThenBy dalam urutan yang benar, untuk sebanyak mungkin jenis yang Anda suka.
Ada banyak cara Anda dapat menggunakan ini tergantung pada kasus penggunaan Anda, tetapi jika Anda misalnya memberikan daftar kolom sortir dan arah sebagai string dan bools, Anda dapat mengulanginya dan menggunakannya dalam sakelar seperti:
Ya, Anda tidak boleh menggunakan banyak OrderBy jika Anda bermain dengan banyak tombol. ThenBy adalah taruhan yang lebih aman karena akan dilakukan setelah OrderBy.
OrderBy(a).OrderBy(b).OrderBy(c)
masih menggunakan keluaran dari pengurutan sebelumnya, dan menyusun ulang semuanya, tetapi mempertahankan urutan yang ada (dari langkah sebelumnya) di mana dua elemen sama di bawah perbandingan baru. Bayangkan kita baru sajaOrderBy(a).OrderBy(b)
. Hasil dariOrderBy(a)
berada dia
urutan yang meningkat , dan kemudian diurutkan kembali sesuai denganb
. Pada hasil akhir, jika dua nilai memiliki nilai yang samab
, mereka akan diurutkan berdasarkana
karena pengurutannya stabil - jadi setara denganOrderBy(b).ThenBy(a)
.Saya menemukan perbedaan ini menjengkelkan saat mencoba membangun kueri secara umum, jadi saya membuat sedikit bantuan untuk menghasilkan OrderBy / ThenBy dalam urutan yang benar, untuk sebanyak mungkin jenis yang Anda suka.
Ada banyak cara Anda dapat menggunakan ini tergantung pada kasus penggunaan Anda, tetapi jika Anda misalnya memberikan daftar kolom sortir dan arah sebagai string dan bools, Anda dapat mengulanginya dan menggunakannya dalam sakelar seperti:
Hasil di
sortedQuery
diurutkan dalam urutan yang diinginkan, alih-alih menggunakan berulang-ulang seperti yang diperingatkan oleh jawaban lain di sini.sumber
jika Anda ingin mengurutkan lebih dari satu bidang, pilih ThenBy:
seperti ini
sumber
Ya, Anda tidak boleh menggunakan banyak OrderBy jika Anda bermain dengan banyak tombol. ThenBy adalah taruhan yang lebih aman karena akan dilakukan setelah OrderBy.
sumber