Maison >développement back-end >C++ >Comment effectuer une jointure extérieure complète sur deux listes à l'aide de LINQ?

Comment effectuer une jointure extérieure complète sur deux listes à l'aide de LINQ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-31 17:16:10923parcourir

How to Perform a Full Outer Join on Two Lists Using LINQ?

Linq -Tall Connexion externe

Question:

Comment utiliser LINQ pour effectuer une connexion externe complète sur les deux listes d'objets, même si certains objets de la liste existent?

Explication:

Connexion interne: Les éléments avec des clés correspondants dans les deux listes sont éliminés pour exclure les éléments sans éléments correspondants.

    Connexion externe (connexion gauche):
  • y compris les éléments de la liste de gauche, il n'y a aucun élément correspondant même dans la liste de droite. Toute connexion externe:
  • y compris les éléments dans deux listes, qu'ils aient des éléments correspondants dans une autre liste.
  • implémenter:
  • Le code suivant fournit une méthode d'extension générale pour effectuer toute la connexion externe:
Cette méthode utilise les paramètres suivants:

Deux listes A et B à connecter.

La clé SelectKeyA et SelectKeyB, spécifiez quelle application d'attribut des objets dans A et B comme clé de connexion.

<code class="language-csharp">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,
    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;
}</code>
Projet du projet Project, spécifiez comment convertir l'élément connecté en Tresult de type de résultat.

La valeur par défaut facultative defaulta et defaultB, s'il n'y a pas d'élément correspondant dans une autre liste, utilisez ces valeurs.
  • Comparaison des clés facultative CMP, qui est utilisée pour spécifier la comparaison de comparaison des clés personnalisée.
  • Utilisation:
  • Pour utiliser cette méthode d'extension, appelez-la simplement sur la première liste A:
  • Cela générera la sortie requise:

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