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; // 跳出循环
}
}
补充:软件开发 , C# ,