question:
Comment effectuer une connexion complète entre deux listes d'objets en fonction des champs clés communs, en s'assurant que tous les enregistrements dans les deux listes sont inclus dans le résultat, même s'ils n'ont pas de correspondances correspondantes dans l'autre liste?
Répondre:
public static IEnumerable FullOuterJoin(
this IEnumerable a,
IEnumerable b,
Func selectKeyA,
Func selectKeyB,
Func projection,
TA defaultA = default(TA),
TB defaultB = default(TB),
IEqualityComparer cmp = null)
{
cmp = cmp ?? EqualityComparer.Default;
var alookup = a.ToLookup(selectKeyA, cmp);
var blookup = b.ToLookup(selectKeyB, cmp);
var keys = new HashSet(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;
}
2.
et lastNames
. Pour effectuer une connexion externe complète, nous pouvons utiliser le code suivant:
var outerJoin = from first in firstNames
join last in lastNames
on first.ID equals last.ID
into temp
from last in temp.DefaultIfEmpty()
select new
{
id = first != null ? first.ID : last.ID,
firstname = first != null ? first.Name : string.Empty,
surname = last != null ? last.Name : string.Empty
};
Ce code utilise une jointure extérieure gauche, où chaque enregistrement dans lastNames et se connecte à la valeur par défaut si aucune correspondance n'est trouvée. L'instruction
en température crée une collection temporaire d'enregistrements correspondants dans
lastNames , nous permettant d'appliquer
defaulfempty () pour garantir que des enregistrements de non-affection sont inclus. Cela implémente en fait une connexion extérieure gauche, pas une connexion extérieure complète au sens complet. Pour obtenir une connexion externe complète, vous devez utiliser la méthode d'extension
fullouterjoin personnalisée ci-dessus.
4.
La sortie attendue pour une connexion entièrement externe est:
ID FirstName LastName
-- --------- --------
1 John Doe
2 Sue
3 Smith
pour le nom incompatible et un entier négatif pour l'ID non apparenté. Le temps d'exécution de la connexion entièrement externe est o (n m), où n et m sont les longueurs des deux listes d'entrée. En effet
7.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3