Heim >Backend-Entwicklung >C++ >Wie führe ich einen vollständigen Outer -Join in Linq aus, um zwei Listen von Personen basierend auf der ID zu verschmelzen?

Wie führe ich einen vollständigen Outer -Join in Linq aus, um zwei Listen von Personen basierend auf der ID zu verschmelzen?

DDD
DDDOriginal
2025-01-31 17:11:10167Durchsuche

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

linq -all externe Verbindung

<:> Frage:

Geben Sie zwei Listen von Personal, die IDs und Namen oder Nachnamen enthalten, eine vollständige externe Verbindung an, um eine persönliche Liste mit Namen und Nachnamen zu generieren.

Antwort:

Der Unterschied zwischen der gesamten externen Verbindung und anderen Verbindungen besteht darin, dass sie die Elemente aus zwei Eingablisten enthält, auch wenn in einer anderen Liste kein Übereinstimmungselement vorhanden ist. Aus diesem Grund können wir die Erweiterungsmethode verwenden, und ihr Arbeitsprinzip lautet wie folgt:

Verwenden Sie die angegebene Funktion der Schlüsselauswahlfunktion, um eine Suchentabelle für zwei Eingabelisten zu erstellen.

FullOuterJoin Identifizieren Sie die eindeutige Taste in den beiden Suchtabellen und kombinieren Sie sie zu einer Sammlung.

    Durchqueren von Schlüsselsätzen und rufen Sie den entsprechenden Wert für jeden Schlüssel ab.
  1. Verwenden Sie die Projektionsfunktion, um die erforderlichen Ergebnisse jeder Iteration zu generieren.
  2. Die aktualisierte Code -Implementierung:
Beispiel Verwendung:

Dieser Code gibt die folgenden Ergebnisse aus:
<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>

Diese überarbeitete Antwort verwendet , um die Portal-Nullwerte aus

ordnungsgemäß zu verarbeiten, und gibt den Namen und den Nachnamen direkt aus, wobei das Ergebnis klarer wird. > Oder
<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>
sind null

Das obige ist der detaillierte Inhalt vonWie führe ich einen vollständigen Outer -Join in Linq aus, um zwei Listen von Personen basierend auf der ID zu verschmelzen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn