有关C#中的foreach


  在编写C#代码时,我们会发现使用foreach循环会比使用for循环方便,不需要进行数据类型的强制转换,不需要使用下标!通过帮助文档的查看可知,如果要对一个对象使用foreach进行循环的话则此对象的类型必须拥有GetEnumerator方法,此方法是在IEnumerable接口下的,但是否实现此接口无所谓!GetEnumerator方法需要返回一个IEnumerator的实例,因为在进行foreach遍历时会使用到一个属性:Current和一个方法:MoveNext!以下是带有注释的源代码:
using System;
using System.Collections;
  namespace ConTest01
{
 /// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 class Class1
 {
  /// <summary>
  /// 应用程序的主入口点。
  /// </summary>
  [STAThread]
  static void Main(string[] args)
  {
   Persons p = new Persons("jack","tom","marry","mike");
   foreach(string s in p)
   {
    Console.WriteLine(s);
   }
  }
 }
   public class Persons
 {
  public string[] m_Names;
    public Persons(params string[] Names)
  {
   this.m_Names = new string[Names.Length];
   Names.CopyTo(this.m_Names,0);
  }
    public string this[int index]
  {
   get
   {
    return this.m_Names[index];
   }
   set
   {
    this.m_Names[index] = value;
   }
  }
    #region IEnumerable 成员
    //如果此类需要被foreach遍历则必须拥有此方法,至于是否实现IEnumerable接口倒是无所谓
  public IEnumerator GetEnumerator()
  {
   //返回一个IEnumerator的实例
   return new PersonsEnumerator(this);
  }
    #endregion
   }
   public class PersonsEnumerator : IEnumerator
 {
  private int index = -1;
  private Persons P;
    public PersonsEnumerator(Persons P)
  {
   this.P = P;
  }
    #region IEnumerator 成员
    //重置方法
  public void Reset()
  {
   this.index = -1;
  }
    //得到当前值的属性,是只读,因此在进行foreach遍历时不能修改遍历到的元素内容
  public object Current
  {
   get
   {
    return this.P[index];
   }
  }
    //将当前实例内部的索引前进一位,并判断前进后是否还有元素
  public bool MoveNext()
  {
   int tempIndex = ++this.index;
   if(tempIndex >= this.P.m_Names.Length)
   {
    return false;
   }
   else
   {
    return true;
   }
  }
  #endregion
   }
  要对一些对象做添加修改删除处理。别的到没什么,删除时出现了点问题似的。

  因为是从一个类的集合中删除掉一个元素。这样就要遍历整个集合,而foreach正是为遍历准备的新玩意。自然而然用上了。于是代码类似如下:

string temp = name.Text; // 从TextBox中读出数据
foreach (LCourse cou in Data.myCourse) // 在List中遍历
{
if (cou.name == temp) // 判断cou的名字匹配
{
Data.myCourse.Remove(cou); // 匹配的即为要删除的,从列表中去除
break; // 跳出循环
}
}

本篇文章来源于:开发学院 http://edu.codepub.com 原文链接:http://edu.codepub.com/2010/0630/23928.php

文章来自: 转帖
引用通告地址: http://www.zhangyongjun.com/blog/trackback.asp?tbID=3880
Tags: C#
评论: 0 | 引用: 0 | 查看次数: 35
发表评论
你没有权限发表留言!