黑马程序员技术交流社区

标题: 关于c#中的循环 [打印本页]

作者: 熊鑫    时间: 2013-4-18 10:37
标题: 关于c#中的循环
c#中循环有4种
do while/while/for还有一个叫foreach
前面两个的区别我知道
for和foreach,的区别是什么。

作者: wlt    时间: 2013-4-18 10:57
for和foreach有本质的区别     
foreach的具体过程是由目标对象控制的   
所以并非集合内容更改了就不可以使用foreach     
而是Array和Collection对象如此实现了它而已     
你却可以完全按照自己的想法去实现这一过程         
也许你可以去翻一下Gof的Visitor模式,foreach看起来就是它的简化版本     
我们应该把foreach当作一种设计模式而不是简单的一个循环语句去理解         
目前C#里的foreach是以IEnumerable的方式去实现,这只是保留COM的实现方式,这种方式我认为其实不太便于理解     
我想如果存在一个IForEachable其成员为ForEach(..),这样可能更能让人容易明白
作者: mdl    时间: 2013-4-18 11:08
do while,while,for这三种循环差不多,都是在已知循环次数时进行的循环,foreach循环一般用来遍历数组,也就是对数组中的每一项进行访问,当然前面三种循环也可以遍历数组,但写起来比起foreach更麻烦。
下面分别是用for和foreach循环遍历数组的例子:
                                             public class program
                                                                                         {
                                                                                             public static void Main()
                                                                                                                           {
                                                                                                                                 int m=0;
                                                                                                                                 int[]  a=new int[5]{1,2,3,4,5};
                                                                                                                                 for(int i=0;i<5;i++)
                                                                                                                                       {
                                                                                                                                            m=int[i];
                                                                                                                                         }
                                                                                                                                  Console.WriteLine(m);
                                                                                                                                }
                                                                                                 }
                                                                                   
                                                                                public class program
                                                                                                  {
                                                                                                     public static void Main()
                                                                                                                                {
                                                                                                                                  int m=0;                                                                                       
                                                                                                                                  int[] a=new int[5]{1,2,3,4,5};
                                                                                                                                  foreach(int i in a)//这里用到了in关键字
                                                                                                                                           {
                                                                                                                                              m=i;
                                                                                                                                             }
                                                                                                                                      Console.WriteLine(m);
                                                                                                                                   }
                                                                                                        }
                                                                                                                                                                                                                           
                                                                                                                                          
                                                                                            
                                
                                 
                        
作者: 陈帅    时间: 2013-4-18 12:08
Foreach
是专门用来遍历数组和集合元素的,
foreach
的工作原理是逐个枚举出数组或集合中
的每一个元素
Foreach
一般语法格式:
  1. Foreach(类型 item in 集合/数组)

  2. 语句块

复制代码
for循环则不同
  1. for 循环:
  2. for(表达式1;表达式2;表达式3)//表达式1是一个变量,即一个初始化序列;表达式2是每次循环要验证的条件,当不满足的时候会跳出for循环,表达式3则是每次循环结束后要执行的语句,用来改变循环条件
  3. {
  4. 循环体;
  5. }
复制代码
一般已知次数循环次数的用for循环
作者: 王赟    时间: 2013-4-18 15:35
如果可以用for遍历的,一般来说for语句效率高,但是前提是for语句内部的索引器的实现
向来效率是在于“某某[i]”的实现方式,如果是间接寻址,效率自然没的说
foreach只能算一种简写而已,实际内容是
while (枚举器.Next())
  对象 o = 枚举器.Current;
这算是语句的简写,其实根本不算循环语句,是一种方法的调用而以,与间接寻址,效率根本没法比的
与很多索引器相比,一般还是会快一些的,因为很多集合中使用的结构是类似链表,要查个“某某[i]”需要遍历很多次
作者: 熊薇    时间: 2013-4-18 17:04
楼上说的很全补充一点,对数组的遍历使用foreach与for的主要区别在于:
foreach循环对数组内容进行只读访问,所以不能改变任何元素的值,如下代码是错误的
string[] names={"KG","LBJ","KB"};
foreach (string name in names)
{
name="KKKKK";  //只读的,编译出错
}
作者: 李广水    时间: 2013-4-18 20:58
console.writelint("{0,-10}",--);负号代表左对齐 没有负号代表右对齐
你可以试一下。。。
作者: 风雪再现    时间: 2013-4-19 13:18
当对整个数组进行相同的操作或者可以统一限定的时候用foreach比较方便简单,但是要对数组中多个元素同时有操作,就必须要用for循环,比如:
namespace 冒泡排序
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] ints = new int[6] {23,42,31,87,12,65 };
            for (int i = 0; i < ints.Length-1; i++)
            {
                for (int j = 0; j < ints.Length - 1 - i; j++)
                {
                    if (ints[j] < ints[j + 1])
                    {
                        int num;
                        num = ints[j];
                        ints[j] = ints[j + 1];
                        ints[j + 1] = num;
                    }
                }
                //for (int j = i + 1; j < ints.Length; j++)
                //{
                //    if (ints[i] < ints[j])
                //    {
                //        int num;
                //        num = ints[i];
                //        ints[i] = ints[j];
                //        ints[j] = num;

                //    }
                //}
            }
            foreach (int i in ints)
            {
                Console.WriteLine(i);
               
            }
            Console.ReadKey();
            
        }
    }
}
上面的for循环就不能换成foreach,但是下面的foreach却可以换成for循环。
作者: 熊鑫    时间: 2013-4-19 14:44
mdl 发表于 2013-4-18 11:08
do while,while,for这三种循环差不多,都是在已知循环次数时进行的循环,foreach循环一般用来遍历数组,也 ...

in是什么意思。
作者: 王赟    时间: 2013-4-19 15:16
你问的是不是foreach (var item in collection)的那个in?
var:要循环访问中的集合的类型
item:表示集合中元素的标识符
collection:要循环访问的集合或者数组的名称
其实in就是"在"的意思

         




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2