LINQ - 全外部聯接
問題:
如何使用LINQ對兩個對象列表執行全外部聯接,即使列表中某些對象並非所有屬性都存在?
說明:
實現:
以下代碼提供了一種執行全外部聯接的通用擴展方法:
<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 上調用它:
<code class="language-csharp">var join = a.FullOuterJoin(b, a => a.ID, b => b.ID, (a, b, id) => new { id = a != null ? a.ID : b.ID, firstname = a != null ? a.Name : string.Empty, surname = b != null ? b.Name : string.Empty });</code>
這將產生所需輸出:
<code>ID FirstName LastName -- --------- -------- 1 John Doe 2 Sue NULL 3 NULL Smith</code>
以上是如何使用LINQ在兩個列表上執行完整的外部連接?的詳細內容。更多資訊請關注PHP中文網其他相關文章!