一些数据源的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;
}
}

foreach写法:

foreach(ListItem item inthis.DropDownListControl.Items)
{
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);
}

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())
           -DateTime.Parse(DMGroupByUser.Tables[0].Rows[i]["StartTime"].ToString()));
}

foreach写法:

foreach(DataRow currentdr in Datarec.Tables[0].Rows)
{
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。
posted on 2010-08-18 10:35  林枫山  阅读(1181)  评论(0编辑  收藏  举报