2009-10-13 12 views
6

Có ai biết thuật toán Join nào mà LINQ thực hiện với toán tử Join của nó không.LINQ Join có sử dụng Nested Loop, Merge hoặc HashSet Joins không?

Có phải NestedLoop, Merge hoặc HashSet không? Có cách nào để chỉ định một cái khác, nếu được hỗ trợ không?

Trân Albert

+0

Phụ thuộc vào nhà cung cấp. –

+0

Tôi có nghĩa là trong khi sử dụng LINQ To Objects – aattia

Trả lời

9

Đầu tiên nó có hiệu quả tạo ra một tra cứu từ chuỗi "bên trong", sau đó duyệt qua dãy bên ngoài. Sau đó, nó có thể tìm kiếm mỗi khóa từ trình tự bên ngoài và tạo ra mỗi cặp thích hợp. Một cái gì đó như thế này (bỏ qua xác thực đối số, v.v.):

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); 
     } 
    } 
} 

Tra cứu sẽ sử dụng bảng băm bên trong cho các phím, để tìm kiếm bất kỳ khóa nào hiệu quả.

Các vấn đề liên quan