c# – 是否有一种“聪明”的方式来打破嵌套循环?
(现在我主要使用C#.欢迎其他语言的想法,但如果可以,请将它们翻译成C#,并且要明确.)
我一次又一次遇到的是嵌套循环,搜索一些2D数组以找到一个元素(通常是一些对象),然后必须对其进行操作.所以当然,一旦你找到那个对象,就应该打破这两个循环,这样你就不必不必要地继续搜索你已经找到的东西(特别是在可以遍历指数巨大数组的嵌套循环中). 以下代码是我目前的首选方式: Obj O = null; bool KeepLooping = true; for (int j = 0; j < height && KeepLooping; j++) { for (int i = 0; i < width; i++) { if (ObjArray[i,j] != null && ObjArray[i,j].property == search_value) { O = ObjArray[i,j]; // you found it,now remember it KeepLooping = false; // clear the flag so the outer loop will break too break; } } } 感谢Erik Funkenbusch,如果我们这样做,它会变得更加优雅: Obj O = null; for (int j = 0; j < height && O == null; j++) // much,much better idea to check O for null in the outer loop { for (int i = 0; i < width; i++) { if (ObjArray[i,now remember it break; } } } 不再需要那个讨厌的额外布尔值! 然而,寻求替代或更好的解决方案仍在继续.这些年来,我尝试了很多其他的方法,但发现它们并不是因为某种原因而变得那么好: >将j(外循环迭代器)设置为高于高度的值,这将触发它自动中断.不理想,因为有时你想记住你发现它的i和j值. 由于User_PWY,还有一个非常聪明的第7种方式: int size = width*height; // save this so you dont have to keep remultiplying it every iteration for (int i = 0; i < size; i++) { int x = i % width; // ingenious method here int y = i / width; // ingenious method here O = ObjArray[x,y]; if (O != null) break; // woohoo! } 这有效地将2D阵列压缩成一个用于迭代的循环.然而,一些批评指出,与i或j相比,mod和除法运算符相当缓慢,因此它可能会更慢(请记住我们正在处理谁知道什么大小的2D数组).就像我评论的那样,应该有一种方法可以在一次操作中得到除法和余数,因为我非常确定x86汇编代码具有DIV操作码,它将商和余数存储在单独的寄存器中,所有这些都在一个DIV指令中.但是如何在C#中使用它,idk. 如果C#允许你命名循环(如L1和L2)然后执行类似L1.break()的操作,那将是很好的.无论你在哪个循环中.唉……用这种语言做不到. (有没有一些秘密的方法可以使用宏来做到这一点?)是否有一个C#6.0实现了这个功能? 编辑:在我看来,我判断他们的优雅和速度的解决方案.请记住,我们正在处理嵌套循环,这可能会成倍增长.额外的操作或比较可能会有所不同. 好吧,好吧,告诉我你喜欢的方式,特别是如果这里没有列出的话. 解决方法for (int i = 0; i < width*height; i++) { int x=i%width,y=i/width; //dostuff } 我喜欢这种访问2d数组的方式. 评论1) 评论2) #define FOR2DARRAY(WIDTH,HEIGHT) for (int i = 0,x = 0,y = 0; i < (WIDTH)*(HEIGHT); i++,x=i%(WIDTH),y=i/(HEIGHT)) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |