<:> 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.
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; } }
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. > Atauvar 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);
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!