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;工作只发生在每次MoveNext()调用迭代器(或Dispose())期间。因为Take() also不读取整个流,所以这种行为被保留。

但是,需要注意的是,有些操作需要在本地缓存数据——GroupByOrderBy最为明显;但是,只要使用非缓冲操作,就没有问题。 例如:

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

你应该看看这个:

LINQ和延迟执行

相关内容

  • 没有找到相关文章

最新更新