Foreach循环,确定哪个是循环的最后一次迭代

我有一个foreach循环,当从List选择最后一个项目时需要执行一些逻辑,例如:

 foreach (Item result in Model.Results)
 {
      //if current result is the last item in Model.Results
      //then do something in the code
 }

我可以知道哪个循环是最后一个循环而不使用循环和计数器吗?


如果你只需要用最后一个元素做一些事情(与最后一个元素不同的地方) ,那么使用LINQ将在这里帮助:

Item last = Model.Results.Last();
// do something with last

如果你需要做一些与最后一个元素不同的东西,那么你需要这样的东西:

Item last = Model.Results.Last();
foreach (Item result in Model.Results)
{
    // do something with each item
    if (result.Equals(last))
    {
        // do something different with the last item
    }
    else
    {
        // do something different with every item but the last
    }
}

尽管您可能需要编写一个自定义比较器来确保您可以知道该项目与Last()返回的项目相同。

由于Last可能需要遍历集合,所以应谨慎使用此方法。 虽然这对于小型集合来说可能不是问题,但是如果它变大,它可能会对性能产生影响。


如何一个好的老式循环?

for (int i = 0; i < Model.Results.Count; i++) {

     if (i == Model.Results.Count - 1) {
           // this is the last item
     }
}

或者使用Linq和foreach:

foreach (Item result in Model.Results)   
{   
     if (Model.Results.IndexOf(result) == Model.Results.Count - 1) {
             // this is the last item
     }
}

正如Chris所示,Linq会工作; 只需使用Last()来获得对枚举中最后一个的引用,并且只要你没有使用那个引用,那么执行你的普通代码,但是如果你正在使用那个引用,那么做你的额外事情。 它的缺点是它总是O(N) - 复杂。

你可以使用Count()(如果IEnumerable也是一个ICollection,那么它就是O(1);这对于大多数常用的内置IEnumerables来说都是如此),并将你的foreach与一个计数器混合使用:

var i=0;
var count = Model.Results.Count();
foreach (Item result in Model.Results)
 {
      if(++i==count) //this is the last item
 }
链接地址: http://www.djcxy.com/p/52969.html

上一篇: Foreach loop, determine which is the last iteration of the loop

下一篇: Get index of Enumerator.Current in C#