Frage:
So führen Sie eine vollständige Verbindung zwischen zwei Objektlisten basierend auf den gemeinsamen Schlüsselfeldern aus, um sicherzustellen, dass alle Datensätze in beiden Listen im Ergebnis enthalten sind, auch wenn sie nicht entsprechende Übereinstimmungen in der anderen Liste haben?
Antwort:
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.
und lastnames
. Um eine vollständige externe Verbindung durchzuführen, können wir den folgenden Code verwenden:
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
};
Dieser Code verwendet einen linken äußeren Join, wobei jedes Datensatz in Lastnames verbunden ist und verbindet sich mit dem Standardwert, wenn keine Übereinstimmung gefunden wird. Die
in temp erstellt eine temporäre Sammlung von passenden Datensätzen in
lastnames , in der wir
defaultIfeMpty () anwenden können, um sicherzustellen, dass Mismatch -Datensätze enthalten sind. Dies implementiert tatsächlich eine linke äußere Verbindung, keine vollständige äußere Verbindung im vollständigen Sinne. Um eine vollständige externe Verbindung zu erreichen, müssen Sie die oben angepasste Erweiterungsmethode
Fuluterjoin verwenden.
4.
Die erwartete Ausgabe für eine vollständig externe Verbindung lautet:
ID FirstName LastName
-- --------- --------
1 John Doe
2 Sue
3 Smith
für den nicht übereinstimmenden Namen und eine negative Ganzzahl für die nicht übereinstimmende ID an. Die Laufzeit der vollständig externen Verbindung ist o (n m), wobei n und m die Längen der beiden Eingabelisten sind. Dies liegt daran, dass die Operation tolookup ()
o (n) Zeit nimmt, und nachfolgende Operationen erfordern o (n m) Zeit.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3