Linq究竟在幹什麼?Concat()如何實際加入較低級別的集合?
3
A
回答
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()
的結果時纔會執行迭代器塊中的代碼。)
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可能只是依次枚舉這兩個集合。
相關問題
- 1. 如何在較低的執行級別
- 2. 如何添加集合級別驗證
- 3. 如何在Unity 2017.1.1中導入較低的API級別?
- 4. 集合低級緩存
- 5. vb.net:較低級別的調試
- 6. 覆蓋較低級別的DENY權限
- 7. 具有較低API級別的C2DM?
- 8. MDX較低級別的總和值
- 9. 如何從較低級別的函數中止魚腳本?
- 10. 如何將事件傳遞到d3.js中的較低級別?
- 11. 如何在HtmlUnit中設置較低級別的隱私
- 12. 如何在較低級別的回調中使用變量?
- 13. 如何遍歷較低級別的git倉庫(比git log)
- 14. 如何在較低的Android API級別使用回收視圖?
- 15. 如何在Java中定位較低的語言級別
- 16. 結合了低級別的細節
- 17. Java會話的低級別實現
- 18. Seralization隔離級別的實際用途?
- 19. 給定GeoPoint的實際流量級別
- 20. 如何訪問在較低(父級)級別聲明的Vue對象的屬性?
- 21. 將Oracle ApEx集合加入到實際表中
- 22. 引用如何在較低級別工作
- 23. 使用XSLT轉換xml以在較低級別添加密鑰
- 24. 如何實現優先級集合
- 25. 上級看到較低級別的選項
- 26. 如何調用低級別的KeyHook組合鍵?
- 27. Windows上的低級別鍵盤輸入
- 28. 骨幹集合 - 集合級別的Union 2集合
- 29. 如何在低級別的Silverlight中實現綁定?
- 30. nodejs loglevel:如何打印出日誌的實際級別?
@Jon:我不確定我完全理解你的評論:如果全部都是一種方法,究竟會有什麼不同? – 2010-05-13 16:04:18
你回答的速度有多快?格柵...... – anishMarokey 2010-05-13 16:04:20
@Steven:當LINQ表達式被創建時(因爲'return'),Concat被調用。當LINQ表達式被評估時(因爲「yield return」),ConcatImpl被調用。 @Jon:我喜歡,但男孩你快。也許我只會在你凌晨3點的時候回答。 :) – 2010-05-13 16:09:46