2010-05-13 55 views

回答

9

(我假設這是對的LINQ to對象。任何東西都不會被不同地實現:)

它只是返回了從第一個,然後一切從第二。所有數據都是流式傳輸的。事情是這樣的:

public static IEnumerable<T> Concat(this IEnumerable<T> source1, 
    IEnumerable<T> source2) 
{ 
    if (source1 == null) 
    { 
     throw new ArgumentNullException("source1"); 
    } 
    if (source2 == null) 
    { 
     throw new ArgumentNullException("source1"); 
    } 
    return ConcatImpl(source1, source2); 
} 


private static IEnumerable<T> ConcatImpl(this IEnumerable<T> source1, 
    IEnumerable<T> source2) 
{ 
    foreach (T item in source1) 
    { 
     yield return item; 
    } 
    foreach (T item in source2) 
    { 
     yield return item; 
    } 
} 

我已經分裂成兩個方法,這使得參數驗證可以進行熱切,但我仍然可以使用迭代器塊。 (直到第一次調用MoveNext()的結果時纔會執行迭代器塊中的代碼。)

+0

@Jon:我不確定我完全理解你的評論:如果全部都是一種方法,究竟會有什麼不同? – 2010-05-13 16:04:18

+0

你回答的速度有多快?格柵...... – anishMarokey 2010-05-13 16:04:20

+4

@Steven:當LINQ表達式被創建時(因爲'return'),Concat被調用。當LINQ表達式被評估時(因爲「yield return」),ConcatImpl被調用。 @Jon:我喜歡,但男孩你快。也許我只會在你凌晨3點的時候回答。 :) – 2010-05-13 16:09:46

1

它依次枚舉每個集合併產生每個元素。類似的東西:

public static IEnumerable<T> Concat<T>(this IEnumerable<T> source, IEnumerable<T> other) 
{ 
    foreach(var item in source) yield return item; 
    foreach(var item in other) yield return item; 
} 

(如果你看一下使用反射在實際執行中,你會看到迭代器在一個單獨的方法實際上實現)

1

這取決於你所使用的LINQ提供程序。 LinqToSql或L2E可能使用數據庫UNION,而LINQ to Objects可能只是依次枚舉這兩個集合。