Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk melakukan gabungan luar penuh di Linq untuk menggabungkan dua senarai orang berdasarkan ID?

Bagaimana untuk melakukan gabungan luar penuh di Linq untuk menggabungkan dua senarai orang berdasarkan ID?

DDD
Lepaskan: 2025-01-31 17:11:10
asal
166 orang telah melayarinya

How to Perform a Full Outer Join in LINQ to Merge Two Lists of People Based on ID?

linq -semua sambungan luaran

<:> Soalan:

Berikan dua senarai kakitangan yang mengandungi ID dan nama atau nama keluarga, dan lakukan sambungan luaran penuh untuk menghasilkan senarai peribadi yang mengandungi nama dan nama keluarga.

Jawapan:

Perbezaan antara sambungan luaran dan sambungan lain ialah ia mengandungi item dari dua senarai input, walaupun tidak ada elemen yang sepadan dalam senarai lain. Atas sebab ini, kita boleh menggunakan kaedah lanjutan, dan prinsip kerjanya adalah seperti berikut:

Gunakan fungsi pemilih utama yang ditentukan untuk membuat jadual carian untuk dua senarai input.

FullOuterJoin Kenal pasti butang unik dalam dua jadual carian dan menggabungkannya ke dalam koleksi.

    melintasi set kunci dan mengambil nilai yang sepadan untuk setiap kunci.
  1. Gunakan fungsi unjuran untuk menghasilkan hasil yang diperlukan setiap lelaran.
  2. Pelaksanaan kod yang dikemas kini:
Penggunaan contoh:

Kod ini akan mengeluarkan hasil berikut:
internal static class MyExtensions
{
    internal 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,
        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
                   let xa = alookup[key].DefaultIfEmpty(default(TA))
                   let xb = blookup[key].DefaultIfEmpty(default(TB))
                   select projection(xa.FirstOrDefault(), xb.FirstOrDefault(), key);

        return join;
    }
}
Salin selepas log masuk

Jawapan yang disemak semula ini menggunakan untuk mengendalikan nilai null portal dari

lebih anggun dan langsung mengeluarkan nama dan nama keluarga, menjadikan hasilnya lebih jelas. > Atau
var ax = new[] {
    new { id = 1, name = "John" },
    new { id = 2, name = "Sue" } };
var bx = new[] {
    new { id = 1, surname = "Doe" },
    new { id = 3, surname = "Smith" } };

ax.FullOuterJoin(bx, a => a.id, b => b.id, (a, b, id) => new { a?.name, b?.surname, id })
    .ToList().ForEach(Console.WriteLine);
Salin selepas log masuk
adalah null

Atas ialah kandungan terperinci Bagaimana untuk melakukan gabungan luar penuh di Linq untuk menggabungkan dua senarai orang berdasarkan ID?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan