ホームページ >バックエンド開発 >C++ >LINQを使用して2つのリストで完全な外側結合を実行する方法は?

LINQを使用して2つのリストで完全な外側結合を実行する方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-31 17:16:10970ブラウズ

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

linq -All外部接続質問: リスト内の一部のオブジェクトが存在していても、2つのオブジェクトリストに完全な外部接続を実行するためにLINQを使用する方法は?

説明:

内部接続:2つのリストに対応するキーを持つ要素は、対応する要素のない要素を除外するために削除されます。

外部接続(左接続):左リストに要素を含めて、右のリストにも対応する要素はありません。

すべての外部接続:
    2つのリストの要素が別のリストに対応する要素があるかどうかを含めます。
  • 実装:
  • 次のコードは、すべての外部接続を実行するための一般的な拡張方法を提供します:
  • このメソッドは、次のパラメーターを使用しています:
  • 接続する2つのリストaとb。

キーSelectKeyaとSelectKeyBは、接続キーとしてAとBのオブジェクトの属性アプリケーションを指定します。 プロジェクト関数プロジェクト、接続された要素を結果型TRESultに変換する方法を指定します。

オプションのデフォルト値defaultAおよびdefaultBは、別のリストに対応する要素がない場合、これらの値を使用します。

カスタムキー比較の比較を指定するために使用されるオプションのキー比較CMP。
<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>

使用法:
  • この拡張方法を使用するには、最初のリストa:
  • に電話してください。
  • これにより、必要な出力が生成されます:

以上がLINQを使用して2つのリストで完全な外側結合を実行する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。