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

c#中最有效的循环是什么分享

时间:2023-04-10 14:42:39 C#

C#学习教程:c#中最高效的循环是什么这让我想知道是否有任何理由可以提高性能或方便使用另一个。或者只是个人喜好。拿一个简单的对象varmyList=List;假设对象已填充并且我们想要遍历项目。method1.foreach(variteminmyList){//Dostuff}Method2myList.Foreach(ml=>{//Dostuff});Method3while(myList.MoveNext()){//Dostuff}Method4for(inti=0;iMyObjectAction(i,writer));//写出滴答数。Debug.WriteLine("ForEach方法滴答:{0}",s.ElapsedTicks);}}输出:ForEachmethodticks:3135132204这实际上比使用foreach循环快了大约7.5秒。这并不奇怪,因为它使用直接数组访问而不是使用IEnumerable。但请记住,每个项目都会保存0.0000075740637秒。对于小项目列表,这是不值得的。方法3:while(myList.MoveNext())与方法1一样,这正是编译器所做的(添加using语句,这是一种很好的做法)。您自己解压缩编译器生成的代码不会获得任何好处。为了好玩,我们还是这样做:[TestMethod]publicvoidTestEnumerator(){//创建列表。列表列表=CreateList(ItemsToTest);//创建编写器。使用(TextWriterwriter=CreateNullTextWriter())//获取枚举器。using(IEnumeratorenumerator=list.GetEnumerator()){//创建秒表。秒表s=秒表。开始新();//循环遍历项目。while(enumerator.MoveNext()){//Write.MyObjectAction(enumerator.Current,writer);}//写出滴答数。Debug.WriteLine("Enumeratorloopticks:{0}",s.ElapsedTicks);}}输出:枚举器循环滴答:3241289895方法4:for在这种特殊情况下,您将获得一些速度,因为列表索引器直接进入底层数组以执行查找(这是一个实现细节,顺便说一句,没有什么可说一下吧,不可能是树结构SupportListup)。[TestMethod]publicvoidTestListIndexer(){//创建列表。列表列表=CreateList(ItemsToTest);//创建编写器。using(TextWriterwriter=CreateNullTextWriter()){//创建秒表。秒表s=秒表。开始新();//按索引循环。for(inti=0;iOutput:Listindexercycletoken:3039649305但是,这可以在数组中有所作为。编译器可以打开数组以一次处理多个项目......编译器可以将其展开为五次迭代十项循环中的两项而不是十项循环中一项的十次迭代。但是,我不认为这实际上是在这里完成的(我不得不查看IL和输出编译的IL)。这是测试:[TestMethod]publicvoidTestArray(){//创建列表。MyObject[]array=CreateList(ItemsToTest).ToArray();//创建编写器。使用(TextWriterwriter=CreateNullTextWriter()){//创建秒表。秒表s=Stopwatch.StartNew();//按索引循环。for(inti=0;ioutput:arraycycleflags:3102911316应该注意,开箱即用,Resharper提供建议通过重构把上面的语句改成foreach语句,不是说对,而是减少代码技术债的基础。TL;DR你真的不应该关心这些东西的性能,除非在你的案例中测试表明你有一个真正的瓶颈(并且你必须有大量的项目才能有所作为。一般来说,你应该选择最易于维护的东西,在这种情况下,方法1(foreach)是可行的方法。以上就是C#学习教程:c#中最有效的循环是什么?所有内容共享。如果对你有用,需要进一步了解C#学习教程,希望大家多加关注---本文收集自网络,不代表侵权,如涉及侵权,请点击有权联系管理员删除。如需转载请注明出处: