c#如何在foreach声明中获取最后一次?

时间:2011-01-17 19:42:14

标签: c# .net

  

可能重复:
  Foreach loop, determine which is the last iteration of the loop

foreach (DataRowView row in orderedTable.DefaultView)
{
    if(lasttime) do-something;
}

orderedtable是一个数据表

有谁知道如何找出我们是否在最后一次foreach迭代?请记住,我确实在ordertable中有重复的

9 个答案:

答案 0 :(得分:17)

所有案例中的正确方法是直接使用IEnumerator<T>

using (var enumerator = orderedTable.DefaultView.GetEnumerator())
{
    if (enumerator.MoveNext())
    {
        bool isLast;
        do
        {
            var current = enumerator.Current;
            isLast = !enumerator.MoveNext();
            //Do stuff here
        } while (!isLast);
    }
}

即使您的集合没有Count属性,此方法仍然有效,即使它已经存在,如果Count属性很慢,此方法也会更有效。

答案 1 :(得分:7)

foreach构造不知道这样的事情,因为它同样适用于无界列表。它无法知道最后一个项目是什么。

您也可以迭代手动方式,但是:

for (int i = 0; i < orderedTable.DefaultView.Count; i++) {
    DataRowView row = orderedTable.DefaultView[i];
    if (i == orderedTable.DefaulView.Count - 1) {
        // dosomething
    }
}

答案 2 :(得分:3)

我认为没有人发布的替代方法。如果您不提前知道计数,这很有效。

DataRowView lastRow;
foreach (DataRowView row in orderedTable.DefaultView)
{
    // Do something...

    lastRow = row;
}

if (lastRow != null)
{
  // Do something with last row
}

答案 3 :(得分:2)

如果您想在最后一项上有不同的行为,则必须使用常规for循环。

for (int i = 0; i < orderedTable.DefaultView.Count; i++)
{
    //do stuff
    if (i == orderedTable.DefaultView.Count - 1)
    {
        //do additional special stuff
    }
}

值得注意的是,“另一个Skeet”具有支持Last属性的“智能可枚举”的实现。请参阅此处的文章:http://msmvps.com/blogs/jon_skeet/archive/2007/07/27/smart-enumerations.aspx

有了这个你可以写这样的东西(我可能会弄错了,我自己没试过):

foreach (SmartEnumerable<DataRowView> item in new SmartEnumerable<DataRowView>(orderedTable.DefaultView))
{
    DataRowView row = item.Value;
    if(item.IsLast)
    {
       ///do special stuff
    }
}

答案 4 :(得分:0)

如果您担心跟踪迭代,为什么不使用for代替foreach?然后您可以简单地执行以下操作:

for(int i = 0; i<orderedTable.DefaultView.Count-1;i++)
{
   if(i==orderedTable.DefaultView.Count-1)
   {
      // Last Row
   }
}

答案 5 :(得分:0)

而不是使用foreach获取IEnumerator。如果MoveNext返回null,则前一个是最后一个。

当然也会工作。

答案 6 :(得分:0)

您可能会执行以下操作:

foreach (DataRowView row in orderedTable.DefaultView)
{
    if(row == orderedTable.DefaultView.Last()) do-something;
}

但效率很低。

答案 7 :(得分:0)

您发布的代码与:

相同
if (orderedTable.DefaultView.Rows.Count > 0)
    do-something;

如果这不符合你的要求,你必须解释lastTime的作用。

答案 8 :(得分:0)

如果我理解你的问题,这会有帮助吗?

int lastrow = 0;
foreach (DataRow row in table.Rows) // Loop over the rows.
{
    lastrow++;
    // Do Something
    if (lastrow == (table.Rows.Count - 1))
    {
        // Do something else
    }
}