Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk melakukan gabungan luar penuh di Linq?

Bagaimana untuk melakukan gabungan luar penuh di Linq?

Patricia Arquette
Lepaskan: 2025-01-31 17:21:13
asal
802 orang telah melayarinya

How to Perform a Full Outer Join in LINQ?

sambungan luar linq -outer

<:> Soalan:

Bagaimana untuk melaksanakan satu konkrit penuh antara kedua -dua objek berdasarkan bidang kunci awam untuk memastikan semua rekod kedua -dua senarai dimasukkan ke dalam hasilnya.

Jawapan:

1. Kaedah sambungan tersuai yang disambungkan ke seluruh luar

Untuk mencapai sambungan luar di Linq, kita boleh menentukan kaedah pengembangan tersuai, seperti yang ditunjukkan di bawah:

2. Melaksanakan

Dalam contoh yang disediakan, kami mempunyai dua senarai:
public static IEnumerable<TResult> FullOuterJoin<TA, TB, TKey, TResult>(
    this IEnumerable<TA> a,
    IEnumerable<TB> b,
    Func<TA, TKey> selectKeyA,
    Func<TB, TKey> selectKeyB,
    Func<TA, TB, TKey, TResult> projection,
    TA defaultA = default(TA),
    TB defaultB = default(TB),
    IEqualityComparer<TKey> cmp = null)
{
    cmp = cmp ?? EqualityComparer<TKey>.Default;
    var alookup = a.ToLookup(selectKeyA, cmp);
    var blookup = b.ToLookup(selectKeyB, cmp);

    var keys = new HashSet<TKey>(alookup.Select(p => p.Key), cmp);
    keys.UnionWith(blookup.Select(p => p.Key));

    var join = from key in keys
               from xa in alookup[key].DefaultIfEmpty(defaultA)
               from xb in blookup[key].DefaultIfEmpty(defaultB)
               select projection(xa, xb, key);

    return join;
}
Salin selepas log masuk
dan

. Untuk melaksanakan sambungan luar, kita boleh menggunakan kod berikut:

firstNames 3. Penjelasan <3> lastNames Kod ini menggunakan sambungan luar kiri, dan setiap rekod dalam

disambungkan ke rekod perlawanan pertama dalam
var outerJoin = from first in firstNames
                join last in lastNames
                on first.ID equals last.ID
                into temp
                from last in temp.DefaultIfEmpty()
                select new
                {
                    id = first != null ? first.ID : last.ID,
                    firstname = first != null ? first.Name : string.Empty,
                    surname = last != null ? last.Name : string.Empty
                };
Salin selepas log masuk
.

Kenyataan ini mencipta koleksi sementara

rekod yang sepadan, yang membolehkan kami memohon

untuk memastikan ia mengandungi rekod yang tidak memuaskan. Ini sebenarnya menyedari sambungan luaran kiri, bukan koneksi penuh dalam erti kata yang lengkap. Untuk mencapai sambungan luar, anda perlu menggunakan kaedah pengembangan firstNames yang disesuaikan di atas. lastNames into temp 4. Mengharapkan output lastNames DefaultIfEmpty() output yang diharapkan dari sambungan luar ialah: FullOuterJoin

5. Nilai lalai yang ditakrifkan

Kaedah lanjutan menyediakan membolehkan anda menentukan nilai lalai untuk rekod yang tidak memuaskan. Contohnya, kami menentukan

untuk nama yang tidak memuaskan, dan kami menentukan integer negatif untuk ID yang tidak menonjol.
<code>ID  FirstName  LastName
--  ---------  --------
1   John       Doe
2   Sue        
3             Smith</code>
Salin selepas log masuk

6. Langkah berjaga -jaga prestasi

Masa berjalan keseluruhan sambungan luar adalah O (n m), di mana n dan m adalah panjang dua senarai input. Ini kerana operasi string.Empty memerlukan masa O (n), dan operasi seterusnya memerlukan masa O (n m).

7. Pelaksanaan Linq

Pelaksanaan keseluruhan sambungan luar kini bukan sebahagian daripada standard Linq, tetapi disyorkan untuk memasukkannya dalam versi masa depan. LINQ standard tidak secara langsung menyokong sambungan luar dan perlu disesuaikan untuk mencapainya. ToLookup()

Atas ialah kandungan terperinci Bagaimana untuk melakukan gabungan luar penuh di Linq?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan