[英]C# LINQ optimization
優化以下類型語句的正確方法是什么:
IEnumerable<T> sequence = BuildSequence();
// 'BuildSequence' makes some tough actions and uses 'yield return'
// to form the resulting sequence.
現在,如果我願意只采取一些第一個元素,我可以使用類似的東西:
sequence.Take(5);
因此,如果我的BuildSequence
序列實際上包含數千個元素,我顯然不希望構造所有元素,因為我只需要其中的5個。
LINQ
是否優化了這種操作,或者我必須自己發明一些東西?
迭代器塊 ( yield return
)為您處理此問題; 迭代器塊是一個流 API; 只有在迭代器(或Dispose()
)的每個MoveNext()
調用期間才會發生工作。 由於Take()
也不會讀取整個流,這種行為將被保留。
但請注意,某些操作需要在本地緩沖數據 - 最顯着的是GroupBy
和OrderBy
; 但只要你使用非緩沖操作,你就可以了。
例如:
static IEnumerable<int> ReadInts() {
var rand = new Random();
while(true) yield return rand.Next();
}
...
int count = ReadInts().Take(10).Count(); // 10 - it doesn't loop forever
你應該看看這個:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.