我写了一个方法,使用System.
Linq将项目列表细分为多个列表.
当我为50000个简单整数运行此方法时,它需要大约59.862秒.
当我为50000个简单整数运行此方法时,它需要大约59.862秒.
Stopwatch watchresult0 = new Stopwatch(); watchresult0.Start(); var result0 = SubDivideListLinq(Enumerable.Range(0,50000),100).ToList(); watchresult0.Stop(); long elapsedresult0 = watchresult0.ElapsedMilliseconds;
所以我试着提升它,并用一个简单的循环来编写它,迭代我列表中的每个项目,它只需要4毫秒:
Stopwatch watchresult1 = new Stopwatch(); watchresult1.Start(); var result1 = SubDivideList(Enumerable.Range(0,100).ToList(); watchresult1.Stop(); long elapsedresult1 = watchresult1.ElapsedMilliseconds;
这是我使用Linq的Subdivide方法:
private static IEnumerable<List<T>> SubDivideListLinq<T>(IEnumerable<T> enumerable,int count) { while (enumerable.Any()) { yield return enumerable.Take(count).ToList(); enumerable = enumerable.Skip(count); } }
这是我的Subdivide方法,每个项目都有foreach循环:
private static IEnumerable<List<T>> SubDivideList<T>(IEnumerable<T> enumerable,int count) { List<T> allItems = enumerable.ToList(); List<T> items = new List<T>(count); foreach (T item in allItems) { items.Add(item); if (items.Count != count) continue; yield return items; items = new List<T>(count); } if (items.Any()) yield return items; }
你有任何想法,为什么我自己的实现比用Linq划分要快得多?或者我做错了什么?
并且:正如您所看到的,我知道如何拆分列表,因此这不是相关问题的重复.我想知道linq和我的实现之间的性能.不是如何拆分列表
解决方法
如果您追求可读性和性能您可能希望使用此算法.在速度方面,这个非常接近你的非linq版本.同时它更具可读性.
private static IEnumerable<List<T>> SubDivideListLinq<T>(IEnumerable<T> enumerable,int count) { int index = 0; return enumerable.GroupBy(l => index++/count).Select(l => l.ToList()); }
它的替代方案:
private static IEnumerable<List<T>> SubDivideListLinq<T>(IEnumerable<T> enumerable,int count) { int index = 0; return from l in enumerable group l by index++/count into l select l.ToList(); }
另一种选择:
private static IEnumerable<List<T>> SubDivideListLinq<T>(IEnumerable<T> enumerable,int count) { int index = 0; return enumerable.GroupBy(l => index++/count,item => item,(key,result) => result.ToList()); }
在我的电脑中,我得到linq 0.006秒对非linq 0.002秒,这是完全公平的并且可以使用linq.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。