Maison >développement back-end >C++ >Comment effectuer une jointure extérieure complète dans Linq pour fusionner deux listes de personnes en fonction de l'ID?
Question:
Donnez deux listes de personnel contenant des ID et des noms ou des noms de famille et effectuez une connexion externe complète pour générer une liste personnelle contenant des noms et des noms de famille.
Réponse:
La différence entre la connexion externe entière et les autres connexions est qu'il contient les éléments de deux listes d'entrée, même s'il n'y a pas d'élément correspondant dans une autre liste. Pour cette raison, nous pouvons utiliser la méthode Extension, et son principe de travail est le suivant:
Utilisez la fonction Sélectionner de clé spécifiée pour créer une table de recherche pour deux listes d'entrée.
FullOuterJoin
Identifiez le bouton unique dans les deux tables de recherche et combinez-les dans une collection.
Ce code publiera les résultats suivants:
<code class="language-csharp">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; } }</code>
Cette réponse révisée utilise pour gérer les valeurs nuls du portail de
plus gracieusement et publie directement le nom et le nom de famille, ce qui rend le résultat plus clair. > Ou<code class="language-csharp">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);</code>sont nuls.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!