c# – 缓存LINQ查询 – IEnumerable.Skip()

c# – 缓存LINQ查询 – IEnumerable.Skip(),第1张

概述请考虑以下代码 IEnumerable<Items> remainingItems = Itemsvar results = new List<List<Items>>();var counter = 0;while (remainingItems.Any()){ var result = new List<Item>(); result.AddRange(remainin 请考虑以下代码

IEnumerable<Items> remainingItems = Itemsvar results = new List<List<Items>>();var counter = 0;while (remainingItems.Any()){    var result = new List<Item>();    result.AddRange(remainingItems.TakeWhile(x => somePredicate(x,counter));    results.Add(result);    remainingItems = remainingItems.Skip(result.Count);    counter++;}

如果不清楚发生了什么,我会采用IEnumerable,并迭代它直到谓词失败,将所有这些项放入一堆,然后继续迭代其余项,直到下一个谓词失败,并将所有这些在一堆.冲洗,洗涤,重复.

现在我要关注的是IEnumerable.Skip()

由于它使用延迟执行,这意味着我必须遍历我在每个循环中已经跳过的所有元素.

我可以使用ToList()来强制它进行评估,但是它需要迭代所有剩余的项目来执行此 *** 作,这同样糟糕.

所以我真正需要的是一个IEnumerable,它会急切地跳过它,然后存储我们最后的第一点,从那里继续.所以我需要一些功能,如:

IEnumerable.SkipAndCache(n)允许我从第n项开始访问IEnumerator.

有任何想法吗?

解决方法 您可以使用 MoreLinq.有一个名为Memoize的实验函数可以懒惰地缓存序列.所以代码看起来像这样:

while (remainingItems.Any()){    var result = new List<Item>();    result.AddRange(remainingItems.TakeWhile(x => somePredicate(x,counter));    results.Add(result);    remainingItems = remainingItems.Skip(result.Count).Memoize();    counter++;}

这里的结果将不会实现,因为它仍然是懒惰的评估:

remainingItems = remainingItems.Skip(result.Count).Memoize();

这里将对remainingItems序列进行求值和缓存(迭代器不会遍历ToList中的所有元素):

remainingItems.Any()

这里将使用缓存:

result.AddRange(remainingItems.TakeWhile(x => somePredicate(x,counter));

要使用此方法,您需要添加:

using morelinq.Experimental;
总结

以上是内存溢出为你收集整理的c# – 缓存LINQ查询 – IEnumerable.Skip()全部内容,希望文章能够帮你解决c# – 缓存LINQ查询 – IEnumerable.Skip()所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1233172.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存