A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 熊鑫 中级黑马   /  2013-4-18 10:37  /  2244 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

c#中循环有4种
do while/while/for还有一个叫foreach
前面两个的区别我知道
for和foreach,的区别是什么。

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

9 个回复

倒序浏览
for和foreach有本质的区别     
foreach的具体过程是由目标对象控制的   
所以并非集合内容更改了就不可以使用foreach     
而是Array和Collection对象如此实现了它而已     
你却可以完全按照自己的想法去实现这一过程         
也许你可以去翻一下Gof的Visitor模式,foreach看起来就是它的简化版本     
我们应该把foreach当作一种设计模式而不是简单的一个循环语句去理解         
目前C#里的foreach是以IEnumerable的方式去实现,这只是保留COM的实现方式,这种方式我认为其实不太便于理解     
我想如果存在一个IForEachable其成员为ForEach(..),这样可能更能让人容易明白
回复 使用道具 举报
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);
                                                                                                                                   }
                                                                                                        }
                                                                                                                                                                                                                           
                                                                                                                                          
                                                                                            
                                
                                 
                        

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
Foreach
是专门用来遍历数组和集合元素的,
foreach
的工作原理是逐个枚举出数组或集合中
的每一个元素
Foreach
一般语法格式:
  1. Foreach(类型 item in 集合/数组)

  2. 语句块

复制代码
for循环则不同
  1. for 循环:
  2. for(表达式1;表达式2;表达式3)//表达式1是一个变量,即一个初始化序列;表达式2是每次循环要验证的条件,当不满足的时候会跳出for循环,表达式3则是每次循环结束后要执行的语句,用来改变循环条件
  3. {
  4. 循环体;
  5. }
复制代码
一般已知次数循环次数的用for循环

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
如果可以用for遍历的,一般来说for语句效率高,但是前提是for语句内部的索引器的实现
向来效率是在于“某某[i]”的实现方式,如果是间接寻址,效率自然没的说
foreach只能算一种简写而已,实际内容是
while (枚举器.Next())
  对象 o = 枚举器.Current;
这算是语句的简写,其实根本不算循环语句,是一种方法的调用而以,与间接寻址,效率根本没法比的
与很多索引器相比,一般还是会快一些的,因为很多集合中使用的结构是类似链表,要查个“某某[i]”需要遍历很多次

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
楼上说的很全补充一点,对数组的遍历使用foreach与for的主要区别在于:
foreach循环对数组内容进行只读访问,所以不能改变任何元素的值,如下代码是错误的
string[] names={"KG","LBJ","KB"};
foreach (string name in names)
{
name="KKKKK";  //只读的,编译出错
}
回复 使用道具 举报
console.writelint("{0,-10}",--);负号代表左对齐 没有负号代表右对齐
你可以试一下。。。
回复 使用道具 举报
当对整个数组进行相同的操作或者可以统一限定的时候用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:30
9#
mdl 发表于 2013-4-18 11:08
do while,while,for这三种循环差不多,都是在已知循环次数时进行的循环,foreach循环一般用来遍历数组,也 ...

in是什么意思。
回复 使用道具 举报
你问的是不是foreach (var item in collection)的那个in?
var:要循环访问中的集合的类型
item:表示集合中元素的标识符
collection:要循环访问的集合或者数组的名称
其实in就是"在"的意思

         
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马