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