Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Kita Boleh Membandingkan Kesamaan Ungkapan Lambda dengan Cekap dalam C#?

Bagaimanakah Kita Boleh Membandingkan Kesamaan Ungkapan Lambda dengan Cekap dalam C#?

Patricia Arquette
Patricia Arquetteasal
2025-01-05 19:57:41871semak imbas

How Can We Efficiently Compare the Equality of Lambda Expressions in C#?

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