当前位置: 首页 > 编程语言 > C#

如何从列表中选择每个第6个元素(使用Linq)分享

时间:2023-04-10 14:13:50 C#

C#学习教程:如何从列表中选择每第6个元素(使用Linq)我需要选择每6条记录。这是一个坐标列表,我需要获取每第6个值的最小值和最大值。坐标列表(样本):[2.1,4.3,1.0,7.1,10.6,39.23,0.5,...]2.1,4.3,1.0,7.1,10.6,39.23,0.5[2.1,4.3,1.0,7.1,10.6,39.23,0.5,...]坐标与坐标。结果应如下所示:[x_min,y_min,z_min,x_max,y_max,z_max],恰好有6个坐标。下面的代码可以运行,但是遍历所有坐标需要很长时间。我想改用Linq(也许更快?)for(inti=0;i<6;i++){ListcoordinateRange=newList();对于(intj=i;j(index+1)%6==0);Webleeuw的答案在此之前发布,但恕我直言,使用索引作为参数而不是IndexOf方法更清楚。Where方法的重载允许您直接使用索引:coordinateRange.Where((c,i)=>(i+1)%6==0);这样的事情可能会有所帮助:publicstaticIEnumerableEvery(thisIEnumerablesource,intcount){intcnt=0;foreach(源代码中的T项){cnt++;如果(cnt==计数){cnt=0;收益率退货项目;你可以这样使用它:int[]list=new[]{1,2,3,4,5,6,7,8,9,10,11,12,13};foreach(intiinlist.Every(3)){Console.WriteLine(i);编辑:如果你想跳过前几个条目,你可以使用Skip()扩展方法:foreach(intiinlist.Skip(2).Every(6)){Console.WriteLine(i);你想用LINQ做这个的任何具体原因?为什么不写一个每次递增6步的循环,并直接访问值呢?要找到更快的解决方案,请启动配置文件。测量for循环中每个步骤所需的时间,并尽量避免最大的瓶颈。查看您的代码后,您的问题是您在大列表中运行了六次。所以所需的时间总是列表大小的六倍。相反,您应该在整个列表上运行一次并将每个项目放在正确的位置。只是为了自己做一个性能测试,你应该测试这两个方法:ExampleclassforsavingdatapublicclassCoordinates{publicdoublex1{get;放;}publicdoublex2{得到;放;}publicdoubley1{得到;放;}publicdoubley2{得到;放;}publicdoublez1{得到;放;}publicdoublez2{得到;放;}}初始化值持有者坐标minCoordinates=newCoordinates();//因为我们想要保留最小值,它会被初始化为//绝对大于或等于列表中最大值的值minCoordinates.x1=Double.MaxValue;minCoordinates.x2=Double.MaxValue;minCoordinates.y1=Double.MaxValue;minCoordinates.y2=Double.MaxValue;minCoordinates.z1=Double.MaxValue;minCoordinates.z2=Double.MaxValue;如果索引运算符是O(1),则使用for循环for(inti=0;i如果IEnumerator是O(1),则使用foreachintcount=0;foreach(variteminallCoordinates){switch(count%6){案例0:minCoordinates.x1=Math.Min(minCoordinates.x1,item);中断;案例1:minCoordinates.x2=Math.Min(minCoordinates.x2,ite米);休息;情况2:minCoordinates.y1=Math.Min(minCoordinates.y1,item);休息;情况3:minCoordinates.y2=Math.Min(minCoordinates.y2,item);休息;案例4:最小坐标。z1=Math.Min(minCoordinates.z1,item);休息;案例5:minCoordinates.z2=Math.Min(minCoordinates.z2,item);休息;}计数++;好吧,这不是LINQ,但如果你担心性能,这可能会有所帮助>(coordinateRange.IndexOf(c)+1)%6==0);我的位置被纠正了,感谢您的评论。正如codymanix所说,正确答案确实如下:coordinateRange.Where((c,i)=>(i+1)%6==0);最好的方法是重构数据结构,让每个维度都是自己的数组。那么x1_max就是x1.Max()。如果你不能改变输入数据结构,下一个最佳方法是迭代数组一次并在本地执行所有访问。ThishelpstokeepinmemoryinL1cache:以上就是C#学习教程:HowtoSelectEvery6thElementfromaList(UsingLinq)如果对你有用需要了解更多C#学习教程分享,我希望大家多多关注---varminValues=newdouble[]{Double.MaxValue,Double.MaxValue,Double.MaxValue};varmaxValues=newdouble[]{Double.MinValue,Double.MinValue,Double.最小值};对于(inti=0;imaxValues[j])maxValues[j]=allCoordinates[i+j+3];}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: