黑马程序员技术交流社区

标题: foreach的用法 [打印本页]

作者: 包连靖    时间: 2012-4-8 11:23
标题: foreach的用法
class ForEachTest
    {
        static void Main(string[] args)
        {
            int[] fibarray = new int[] { 0, 1, 2, 3, 5, 8, 13 };
            foreach (int i in fibarray)
            {
                System.Console.WriteLine(i);
            }
        }
    }
苏坤老师里面的视频仿佛没怎么用foreach,用法很模糊
上面是MSDN上面的例子,不过MSDN里面的解释看着很深奥的感觉,不知道有没有简单的说法
foreach(int i in fibarray)
这in 是什么意思呀...

作者: 肖腾宇    时间: 2012-4-8 12:02
foreach是通过迭代遍历数组,集合
foreach的语法就是foreach(int 变量名 in 数组(或集合))
作者: 刘冬晓    时间: 2012-4-8 12:05
本帖最后由 刘冬晓 于 2012-4-8 12:29 编辑

in其实可以理解为在的意思,整句 foreach (int i in fibarray)可以这样反向理解,循环输出字符串数组fibarray中每一个int型的元素i。
作者: 黄国钢    时间: 2012-4-8 12:12
foreach(int i in fibarray)
in可以理解为“在……中”,即 遍历在数组fibarray中的每个元素。
作者: 郭耀强    时间: 2012-4-8 12:15
in 从英文来理解也就是在...的里面foreach(int i in fibarray) 就是说申明一个int类型的变量,去这个fibarray 中去取数据,一次就取一个,直到取完完止,它只是一个简单的迭代器不和for循环一样,所以它for的执行效率要快.
在foreach中你需要取什么类型的数据集合,你就申明用什么类型的变量去取。也可以是自己定义的自定义类,例如:
string类型的
List<string> list=new List<string>();
foreach(string s in list)
{
    //在这里你就可以用s来取出这个stirng 类型的集合中所有的值
}
自定义类

class Program
    {
        static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.Name = "张三";
            p1.Age = 12;
            Person p2 = new Person();
            p2.Name = "李四";
            p2.Age = 23;

            List<Person> list = new List<Person>();
            list.Add(p1);
            list.Add(p2);

            foreach (Person p in list)
            {
                Console.WriteLine("Name:{0},年龄:{1}", p.Name, p.Age);
            }
        }

        
    }
    class Person
    {
        public string Name
        { get; set; }
        public int Age
        { get; set; }
    }


谨记,你集合是什么类型,你就用什么类型的变量来取,用自己定义的类,就是要用实例化一个类来取
作者: 刘真    时间: 2012-4-8 13:10
in ...就是包含在...里面的意思
foreach(int i in fibarray)意思就是在int数组fibarray里的每个元素i,相当于遍历fibarray数组
作者: 余晓亮    时间: 2012-4-8 15:30
多做练习 就能明白它的意思了
作者: 郭青松    时间: 2012-4-8 22:55
最近刚好复习到了foreach语句。
我来详细的给你就是一下什么是foreach?
什么对象才能使用foreach ?
以及怎么定制自己的对象 让它也能使用foreach进行迭代?

你应该比较清楚了
我们可以在C#使用使用foreach对数组和集合元素进行迭代。为什么呢?
这不是不无道理的。
原因是在C#中 用[ ](中括号)申明数组的方式其实是调用Array类的标记。
什么意思: 意思是说,当你使用了int[ ] intArr={1,2,3,4};在C#编译器中 其实是调用了Array类的CreateInstance方法的。
也就是说 你只要用 [ ]申明数组,就是间接在使用Array类。你可以理解成是继承了Array类。
在C#中 ,如果你想对一个对象进行迭代,那么这个对象就必须实现IEnmuerable接口。
这个接口中定义了一个 返回类型为 IEnumerator  方法名为GetEnumerator()的这么一个方法。
IEnumerable源代码是这么定义的。
Interface IEnumerable
{
     IEnumerator GetEnumerator();
}

这个接口的返回类型为IEnumerator
这也就是说,实现IEnumerable接口实质上是要你返回一个实现了IEnumerator接口的类型的实例。
下面我们看一下IEnumerator接口中是什么定义的。
这是源代码:
Interface IEnumerator
{
     Object Current{get;}
     bool MoveNext();
     void Reset();
}
因为Array类是默认实现了IEnumerable接口的,那么它当然也就实现了IEnumerator中的这么属性Curent和方法MoveNext(),Reset();
而且前面我也说了,要想使用foreach对一个对象进行迭代,那么该对象必须实现IEnumerable接口,而在C# [ ]申明数组是隐式的在使用
Array ,所以 数组当然可以使用foreach进行迭代了。

在往深说一点
比如下面这个例子:
int[ ] intArr ={1,2,3,4,5};
foreach(var i in intArr)
{
    Console.WriteLine(i.ToString());
}
C#编译器不会直接把foreach语句直接映射为IL中的foreach ,
而会将foreach语句在后台以下面这中模式去进行:
IEnmuerator  MyEnum = intArr.GetEnmerator();
while(MyEnum.MoveNext())
{
      int i = MyEnum.Current as int;
      Console.WriteLine(i.ToString());
}

在往深的话 就会牵扯到yield return 语句 和 “状态机”这些概念在里面了。
我就不多说了。
你可以进我的CSDN博客看,第九篇就是详细讲解了foreach语句的。

作者: 霍世勇    时间: 2012-4-9 10:50
foreach底层也是采用的迭代器实现的。主要是用来遍历。例子List<String> list=new ArrayList<>(String);list.add("aa");.....//添加值略然后遍历for(String temp:list){System.out.println(temp);}这样就可以把list里面的值全输出出来
作者: pray    时间: 2014-4-26 05:28
让人佩服得五体投地的好帖




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