如何判断我是否处于VB.NET中For Each语句的最后一个循环中?
通常,您可以执行的集合For Each
实现IEnumerator
接口.此接口只有两个方法,MoveNext
并Reset
和一个属性,Current
.
基本上,当您For Each
在集合上使用a 时,它会调用该MoveNext
函数并读取返回的值.如果返回的值是True
,则表示集合中存在有效元素,并且通过Current
属性返回元素.如果集合中没有其他元素,则MoveNext
函数返回False
并退出迭代.
从以上的解释,很明显的是,For Each
不跟踪集合中的当前位置,因此在回答你的问题是一个短期无.
但是,如果您仍想知道自己是否在集合中的最后一个元素上,则可以尝试以下代码.它检查(使用LINQ)当前项是否是最后一项.
For Each item in Collection If item Is Collection.Last Then 'do something with your last item' End If Next
使用For循环而不是ForEach可能会更容易.但是,类似地,你可以在ForEach循环中保留一个计数器并查看它是否等于yourCollection.Count - 1
,然后你就在最后一次迭代中.
对于foreach,你不可能知道这一点,直到它为时已晚(即你已经离开了循环).
注意,我假设您正在使用只有IEnumerable接口的东西.如果你有一个列表,数组等,那么请按照这里使用.Count或类似的其他答案来查找有多少项,这样你就可以跟踪你在集合中的位置.
然而,只有IEnumerable/IEnumerator,如果你使用foreach,就没有办法确定是否还有更多.
如果你需要知道这一点,请自己使用IEnumerable,这就是foreach的作用.
以下解决方案适用于C#,但应轻松转换为VB.NET:
List nums = new List();
nums.Add(1);
nums.Add(2);
nums.Add(3);
IEnumerator enumerator = nums.GetEnumerator();
if (enumerator.MoveNext())
{
// at least one value available
while (true)
{
// make a copy of it
Int32 current = enumerator.Current;
// determine if it was the last value
// if not, enumerator.Current is now the next value
if (enumerator.MoveNext())
{
Console.Out.WriteLine("not last: " + current);
}
else
{
Console.Out.WriteLine("last: " + current);
break;
}
}
}
enumerator.Dispose();
这将打印:
not last: 1
not last: 2
last: 3
诀窍是获取当前值的副本,然后要求枚举器尝试继续下一个.如果失败了,你制作的副本确实是最后一个值,否则还有更多.