Membandingkan Kesamaan Ungkapan Lambda Dengan Cekap
Cabaran:
Diberi tandatangan kaedah:
public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)
Tentukan kaedah yang paling berkesan untuk memastikan sama ada kedua-dua ungkapan itu setara. Penilaian ini seharusnya hanya menyokong MemberExpressions yang mudah, seperti c => c.ID.
Penyelesaian Cadangan:
Versi kod Marc yang dioptimumkan yang menyokong tatasusunan, pengendali baharu dan banyak lagi dipaparkan di bawah. Ia menggunakan kaedah yang lebih elegan untuk membandingkan AST.
public static class LambdaCompare
{
public static bool Eq<TSource, TValue>(
Expression<Func<TSource, TValue>> x,
Expression<Func<TSource, TValue>> y)
{
return ExpressionsEqual(x, y, null, null);
}
...
private static bool ExpressionsEqual(Expression x, Expression y, LambdaExpression rootX, LambdaExpression rootY)
{
...
}
...
}
Penjelasan Terperinci:
- Kod ini menyemak sama ada kedua-dua ungkapan adalah sama melalui rujukan sebelum membandingkan nilai demi nilai.
- Ia menilai sama ada kedua-duanya adalah ungkapan malar dan, jika ya, menentukan nilainya.
- Jika ungkapan bukan jenis yang sama, fungsi akan mengembalikan palsu.
- Untuk ungkapan lambda, ia membandingkan parameter dan kandungan ungkapan.
- Untuk ungkapan ahli, ia membandingkan ahli dan ungkapan asas.
- Untuk ungkapan binari, ia membandingkan kaedah, ungkapan kiri, dan ungkapan kanan.
- Untuk ungkapan unary, ia membandingkan kaedah dan operan.
- Untuk ungkapan parameter, ia membandingkan indeksnya dalam senarai parameter.
- Untuk ungkapan panggilan kaedah , ia membandingkan kaedah, objek dan hujah.
- Untuk ungkapan init ahli, ia membandingkan ungkapan baharu dan ahli pengikatan.
- Untuk ungkapan tatasusunan baharu, ia membandingkan elemen.
- Untuk ungkapan baharu, ia membandingkan pembina, hujah dan ahli.
- Untuk ungkapan bersyarat, ia membandingkan ujian, jika salah, dan jika ungkapan benar.
- Jika tiada kriteria di atas sepadan, fungsi itu akan mengeluarkan NotImplementedException.
Kelebihan:
- Menyokong pelbagai jenis ekspresi.
- Membandingkan AST dalam bentuk yang lebih cekap dan elegan cara.
- Tersedia sebagai pakej NuGet untuk memudahkan penyepaduan.
Atas ialah kandungan terperinci Bagaimanakah Kita Boleh Membandingkan Kesamaan Ungkapan Lambda dengan Cekap dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!
Kenyataan:Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn