一些数据源的for和foreach写法
1.DropDownList
for写法:
for(int i=0;i<this.ddl_userlist.Items.Count;i++)
{
if(this.ddl_userlist.Items[i].Value.Equals(reader["Status"].ToString())))
{
this.ddl_userlist.Items[i].Selected=true;break;
}
}
{
if(this.ddl_userlist.Items[i].Value.Equals(reader["Status"].ToString())))
{
this.ddl_userlist.Items[i].Selected=true;break;
}
}
foreach写法:
foreach(ListItem item inthis.DropDownListControl.Items)
{
if(item.Value.Equals(reader["Status"].ToString()))
{
item.Selected=true;break;
}
}
{
if(item.Value.Equals(reader["Status"].ToString()))
{
item.Selected=true;break;
}
}
2.MemorySteam
foreach写法:
MemoryStream stream=new MemoryStream()
StringBuilder builder =new StringBuilder();
foreach(byte num in stream.ToArray())
{
builder.AppendFormat("{0:X2}", num);
}
StringBuilder builder =new StringBuilder();
foreach(byte num in stream.ToArray())
{
builder.AppendFormat("{0:X2}", num);
}
3.DataSet/DataTable
for写法:
DataSet Datarec=...
for(int i=0;i<DMGroupByUser.Tables[0].Rows.Count;i++)
{
currntTimeCount += (DateTime.Parse(DMGroupByUser.Tables[0].Rows[i]["EndTime"].ToString())
for(int i=0;i<DMGroupByUser.Tables[0].Rows.Count;i++)
{
currntTimeCount += (DateTime.Parse(DMGroupByUser.Tables[0].Rows[i]["EndTime"].ToString())
-DateTime.Parse(DMGroupByUser.Tables[0].Rows[i]["StartTime"].ToString()));
}
}
foreach写法:
foreach(DataRow currentdr in Datarec.Tables[0].Rows)
{
currntTimeCount += (DateTime.Parse(currentdr["EndTime"].ToString())
{
currntTimeCount += (DateTime.Parse(currentdr["EndTime"].ToString())
- DateTime.Parse(currentdr["StartTime"].ToString()));
}
}
附上一段for与foreach探讨之评论:(来源于博客园http://www.cnblogs.com/xiaotie/archive/2008/08/24/1274897.html)
#6楼2008-08-24 17:38 | Angel Lucifer
既然大家如此执着于两者,俺来表达下自己的看法:
for 和 foreach 表达的都是迭代语义。
但 foreach 实际上是 C# 编译器对迭代器的封装,它仅能对实现了 .NET 迭代器模式的集合进行顺序访问,除此之外,它什么也干不了。从这点上来看,算是对 Facade 模式的运用。当然它要比 for 语法上优雅那么一点。这一点正是 Facade 模式屏蔽了迭代集合时的啰嗦之处。
foreach 甚至只能只读访问集合,而不能修改集合。如果你要在迭代期间修改集合,会抛出 InvalidOperationException。这是 .NET BCL 团队的设计目标。不过在对并发集合访问时,.NET BCL 团队正打算修改这个设计目标,使其可以在迭代期间修改集合,但这仍然要在听取开发人员反馈之后,才能作出正式决定。而且一旦可以修改,在带来几许好处外,还会引入相当多的麻烦。
而 for 则不同,它除了可以做到上面的功能,还可以修改集合内容,此外还可以进行其他领域的迭代。
至于性能,对在除数组之外的集合进行迭代只读访问时,它两个性能等效。而在数组时,性能也差不多,严格的说,是 for 性能稍高一点,因为少了几分函数调用开销,但其实性能相差不大,这只有在千万数量级及其以上才能体现出影响。
所以,拿 for 与 foreach 进行比较是不公平的, foreach 仅仅是 for 实现功能的一个子集。
更多的可以参考 .NET 的 BCL 以及 C++ 的 STL 和 Boost。
for 和 foreach 表达的都是迭代语义。
但 foreach 实际上是 C# 编译器对迭代器的封装,它仅能对实现了 .NET 迭代器模式的集合进行顺序访问,除此之外,它什么也干不了。从这点上来看,算是对 Facade 模式的运用。当然它要比 for 语法上优雅那么一点。这一点正是 Facade 模式屏蔽了迭代集合时的啰嗦之处。
foreach 甚至只能只读访问集合,而不能修改集合。如果你要在迭代期间修改集合,会抛出 InvalidOperationException。这是 .NET BCL 团队的设计目标。不过在对并发集合访问时,.NET BCL 团队正打算修改这个设计目标,使其可以在迭代期间修改集合,但这仍然要在听取开发人员反馈之后,才能作出正式决定。而且一旦可以修改,在带来几许好处外,还会引入相当多的麻烦。
而 for 则不同,它除了可以做到上面的功能,还可以修改集合内容,此外还可以进行其他领域的迭代。
至于性能,对在除数组之外的集合进行迭代只读访问时,它两个性能等效。而在数组时,性能也差不多,严格的说,是 for 性能稍高一点,因为少了几分函数调用开销,但其实性能相差不大,这只有在千万数量级及其以上才能体现出影响。
所以,拿 for 与 foreach 进行比较是不公平的, foreach 仅仅是 for 实现功能的一个子集。
更多的可以参考 .NET 的 BCL 以及 C++ 的 STL 和 Boost。