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?

Comment effectuer une jointure extérieure complète dans Linq pour fusionner deux listes de personnes en fonction de l'ID?

DDD
DDDoriginal
2025-01-31 17:11:10188parcourir

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

Linq -Tall Connexion externe

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.

    Traverser les ensembles de clés et récupérer la valeur correspondante pour chaque clé.
  1. Utilisez la fonction de projection pour générer les résultats requis de chaque itération.
  2. L'implémentation du code mise à jour:
Exemple Utilisation:

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn