С foreach вы не можете знать это, пока не станет слишком поздно (т. Е. Вы не в курсе).
Обратите внимание, я предполагаю, что вы используете что-то, где у вас есть только интерфейс IEnumerable. Если у вас есть список, массив и т. Д., Следуйте другим ответам, в которых используется .Count или аналогичный, чтобы узнать, сколько элементов существует, и, таким образом, вы можете отслеживать, где находитесь в коллекции.
Однако, используя только IEnumerable / IEnumerator, невозможно точно узнать, есть ли их больше или нет, если вы используете foreach.
Если вам нужно это знать, используйте IEnumerable самостоятельно, что и делает foreach.
Приведенное ниже решение предназначено для C #, но его легко перевести на VB.NET:
.
List<Int32> nums = new List<Int32>();
nums.Add(1);
nums.Add(2);
nums.Add(3);
IEnumerator<Int32> 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
Хитрость заключается в том, чтобы взять копию текущего значения, а затем попросить счетчик попытаться перейти к следующему. Если это не помогло, копия, которую вы сделали, действительно была последним значением, иначе будет больше.