如何简洁地处理 foreach 的第一次循环?

22

在 foreach 循环中,我经常发现自己需要做以下索引计数混乱的操作,以判断当前是否为第一个元素。在C#中是否有一种更优雅的方法来实现这个功能,例如if(this.foreach.Pass == 1)之类的语法?

int index = 0;
foreach (var websitePage in websitePages) {
    if(index == 0)
        classAttributePart = " class=\"first\"";
    sb.AppendLine(String.Format("<li" + classAttributePart + ">" + 
        "<a href=\"{0}\">{1}</a></li>", 
        websitePage.GetFileName(), websitePage.Title));
    index++;
}

我认为方法还不错,简单易用等等。 你看过Spark视图引擎吗?猜测一下你在做什么... PK :-) - Paul Kohler
只是一个快速的想法...你能否单独处理第一个情况,然后在循环中处理其余的情况?(使用 do while 循环实现同样的想法) - aggietech
@Paul,是的,Scott Hanselman在Spark视图引擎上有一个很好的播客节目,谢谢你提醒,我会重新访问:http://www.hanselminutes.com/default.aspx?showID=210 - Edward Tanguay
4
为什么不在CSS中使用li:first-child,而要给第一个li添加一个类呢? - Joel Mueller
12个回答

0
在这个例子中,你可以通过这种方式摆脱索引检查。
foreach (var websitePage in websitePages) 
{ 
    classAttributePart =  classAttributePart ?? " class=\"first\""; 
    sb.AppendLine(String.Format("<li" + classAttributePart + "><a href=\"{0}\">{1}</a></li>", websitePage.GetFileName(), websitePage.Title)); 
} 

最好检查一下结果数据变量来执行这种任务。 在这种情况下,它检查classAttributePart字符串是否为空,并附加初始值。

0

正如我父亲所说,“用正确的工具做正确的事情”。

在这种情况下,看看你的循环需要做什么。

  • 如果可以在循环外完成某些操作,则将其移动并继续使用foreach即可。
  • 如果需要处理复杂的情况组合,则可能需要考虑使用不同的模式(例如:状态模式或最合适的模式)来处理循环内部的内容,在这种情况下,选择最合适的循环结构。
  • 如果您的循环依赖于能够提取迭代索引以将其传递到其他地方,则可能for循环是更好的选择。

否则,回答您的问题,似乎没有简单且不冗长的方法来标识在foreach循环中访问列表项时的索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接