Saya memiliki nama "urutkan berdasarkan properti" dalam sebuah string. Saya perlu menggunakan Lambda / Linq untuk mengurutkan daftar objek.
Ex:
public class Employee
{
public string FirstName {set; get;}
public string LastName {set; get;}
public DateTime DOB {set; get;}
}
public void Sort(ref List<Employee> list, string sortBy, string sortDirection)
{
//Example data:
//sortBy = "FirstName"
//sortDirection = "ASC" or "DESC"
if (sortBy == "FirstName")
{
list = list.OrderBy(x => x.FirstName).toList();
}
}
- Alih-alih menggunakan sekelompok ifs untuk memeriksa fieldname (sortBy), apakah ada cara yang lebih bersih untuk melakukan penyortiran
- Apakah semacam menyadari tipe data?
c#
linq
lambda
linq-to-objects
DotnetDude
sumber
sumber
==
... apa?Jawaban:
Ini dapat dilakukan sebagai
Kerangka .NET melempar lambda
(emp1,emp2)=>int
sebagaiComparer<Employee>.
Ini memiliki keuntungan karena sangat diketik.
sumber
list.sort(functionDeclaredElsewhere)
Satu hal yang bisa Anda lakukan adalah mengubah
Sort
sehingga lebih baik menggunakan lambdas.Sekarang Anda dapat menentukan bidang yang akan disortir saat memanggil
Sort
metode.sumber
Anda bisa menggunakan Refleksi untuk mendapatkan nilai properti.
Di mana TypeHelper memiliki metode statis seperti:
Anda mungkin juga ingin melihat Dynamic LINQ dari perpustakaan VS2008 Samples . Anda bisa menggunakan ekstensi IEnumerable untuk melemparkan Daftar sebagai IQueryable dan kemudian menggunakan ekstensi tautan dinamis OrderBy.
sumber
collection.ToList().OrderBy(x => TypeHelper.GetPropertyValue( x, sortBy)).ToList();
Inilah cara saya memecahkan masalah saya:
sumber
Membangun urutan dengan ekspresi dapat dibaca di sini
Tanpa malu-malu dicuri dari halaman di tautan:
sumber
Anda dapat menggunakan refleksi untuk mengakses properti.
Catatan
sumber
Sortir menggunakan antarmuka IComparable, jika tipe mengimplementasikannya. Dan Anda dapat menghindari ifs dengan menerapkan IComparer khusus:
lalu
sumber
Jawaban untuk 1 .:
Anda harus dapat secara manual membangun pohon ekspresi yang dapat diteruskan ke OrderBy menggunakan nama sebagai string. Atau Anda dapat menggunakan refleksi seperti yang disarankan dalam jawaban lain, yang mungkin kurang berhasil.
Sunting : Ini adalah contoh kerja membangun pohon ekspresi secara manual. (Mengurutkan pada X.Value, ketika hanya mengetahui nama "Nilai" dari properti). Anda dapat (harus) membangun metode generik untuk melakukannya.
Namun, membangun pohon ekspresi mengharuskan Anda mengetahui jenis-jenis partikulat. Itu mungkin atau mungkin tidak menjadi masalah dalam skenario penggunaan Anda. Jika Anda tidak tahu jenis apa yang harus Anda sortir, mungkin akan lebih mudah menggunakan refleksi.
Jawaban untuk 2 .:
Ya, karena Pembanding <T>. Kesalahan akan digunakan untuk perbandingan, jika Anda tidak secara eksplisit mendefinisikan pembanding.
sumber
Satu lagi, kali ini untuk setiap IQueryable:
Anda dapat melewati beberapa kriteria sortir, seperti ini:
sumber
Sayangnya, solusi yang disediakan oleh Rashack tidak berfungsi untuk tipe nilai (int, enum, dll.).
Agar dapat bekerja dengan semua jenis properti, ini adalah solusi yang saya temukan:
sumber
Menambahkan apa yang @Samuel dan @bluish lakukan. Ini jauh lebih pendek karena Enum tidak perlu dalam kasus ini. Ditambah sebagai bonus tambahan ketika Ascending adalah hasil yang diinginkan, Anda hanya dapat memberikan 2 parameter daripada 3 karena true adalah jawaban default untuk parameter ketiga.
sumber
Jika Anda mendapatkan urutkan nama kolom dan urutkan arah sebagai string dan tidak ingin menggunakan sakelar atau jika \ sintaks lain untuk menentukan kolom, maka contoh ini mungkin menarik bagi Anda:
Solusi berdasarkan penggunaan Kamus yang menghubungkan diperlukan untuk mengurutkan kolom melalui Expression> dan string utamanya.
sumber