【问题标题】:Is LINQ Join operator using Nested Loop, Merge, or HashSet Joins?LINQ 连接运算符是否使用嵌套循环、合并或哈希集连接?
【发布时间】:2009-10-13 17:08:56
【问题描述】:

有谁知道 LINQ 使用其 Join 运算符执行什么 Join 算法。

是 NestedLoop、Merge 还是 HashSet?如果支持的话,有什么方法可以指定不同的吗?

问候 阿尔伯特

【问题讨论】:

  • 取决于供应商。
  • 我的意思是在使用 Linq To Objects 时

标签: .net linq join loops nested


【解决方案1】:

首先它有效地从“内部”序列创建查找,然后遍历外部序列。然后它可以从外部序列中查找每个键并产生每个适当的对。像这样的东西(忽略参数验证等):

public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult>
    (this IEnumerable<TOuter> outer,
     IEnumerable<TInner> inner,
     Func<TOuter, TKey> outerKeySelector,
     Func<TInner, TKey> innerKeySelector,
     Func<TOuter, TInner, TResult> resultSelector)
{
    Lookup<TKey, TInner> lookup = inner.ToLookup(innerKeySelector);
    foreach (TOuter outerItem in outer)
    {
        TKey key = outerKeySelector(outerItem);
        foreach (TInner innerItem in lookup[key])
        {
            yield return resultSelector(outerItem, innerItem);
        }
    }
}

查找将在内部为键使用哈希表,以便查找任何单个键的效率。

【讨论】:

    猜你喜欢
    • 2017-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 1970-01-01
    • 2018-06-17
    • 2012-01-17
    • 2019-10-17
    相关资源
    最近更新 更多