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中文网其他相关文章!