Как найти последний цикл в For Each (VB.NET)?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
24
задан Mike B 12 January 2009 в 15:46
поделиться

8 ответов

Проверьте, является ли элемент последним элементом контейнера.

, Почему Вы хотите сделать это?
Вы могли просто поместить инструкции после цикла. (Что Вы выполняетесь на последнем элементе)

1
ответ дан Tamara Wijsman 13 January 2009 в 01:46
поделиться
  • 1
    Я вполне уверен rm <(...), попытается удалить что-то как /proc/fd/123. – jordanm 1 December 2013 в 13:48

Используя стандарт "Для Каждого" цикла Вы не можете. Намерение "для Каждого" цикла состоит в том, чтобы позволить Вам концентрироваться на данных вместо базового набора.

1
ответ дан JaredPar 13 January 2009 в 01:46
поделиться

Вероятно, было бы легче просто использовать Для цикла вместо ForEach. Но, точно так же Вы могли сохранить счетчик в своем Цикле foreach и видеть, если его равное yourCollection.Count - 1, то Вы находитесь в последнем повторении.

13
ответ дан Strelok 13 January 2009 в 01:46
поделиться
  • 1
    @user1297061 да it' s включенный в страницу справочника. Если страница справочника doesn' t говорят, что команда принимает вход от stdin тогда это doesn' t – janos 1 December 2013 в 17:59

Короткий ответ: Вы не можете

ответ Long: нет ничего в семантике оператора For Each, который позволяет Вам определять, выполняете ли Вы первое, в последний раз или какое-либо конкретное повторение.

Для Каждого создается в IEnumerable и IEnumerable<> интерфейсы и поведение зависят от реализации, которую Вы называете. Это допустимо, хотя путая, для набора, которого Вы выполняете итерации для возврата элементов в другом порядке каждый раз. К счастью, List<> не делает этого.

, Если действительно необходимо знать, что конкретное повторение является последним, Вы могли определить последний элемент (заранее) и затем принять другие меры при обнаружении с тем элементом.

Легче должен был бы обнаружить первый повторение (скажите через булевскую переменную), и затем сделайте что-то другое.

пример (C#, но VB будет подобен):

StringBuilder result = new StringBuilder();
bool firstTime = true;
foreach(string s in names)
{
    if (!firstTime)
    {
        result.Append(", ");
    }

    result.Append(s);
    firstTime = false;
}
2
ответ дан Bevan 13 January 2009 в 01:46
поделиться
  • 1
    Это работало отлично для меня. Вместо того, чтобы использовать - называют " .txt" я использовал - печать и остальная часть его все еще работали. Спасибо! – Harlin 29 June 2019 в 04:13

Если Вы связываетесь с IEnumerable. Необходимо ли быть в цикле foreach? Если не Вы могли бы объявить переменную незадолго до цикла foreach. Установите его во время цикла. Затем используйте его после цикла (если не пустой)

0
ответ дан Greg Dean 13 January 2009 в 01:46
поделиться
  • 1
    Очень хорошая мини-статья о чем-то я должен знать лучше. – Cameron 3 August 2015 в 06:41

С 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

прием должен сделать копию текущего значения, затем попросить, чтобы перечислитель попытался идти дальше к следующему. Если это перестало работать, копия, которую Вы сделали, была действительно последним значением, иначе существует больше.

6
ответ дан Alex Essilfie 13 January 2009 в 01:46
поделиться
  • 1
    Также некоторые команды позволят stdin только, когда имя файла - будет дано. Например, энергия: ls | vim - для имения вывода ls в энергии. – Veda 9 March 2015 в 20:00

Было бы легче использовать Для цикла вместо ForEach, однако Вы могли сделать что-то как

If item.Equals(itemCollection(itemCollection.Count)) Then
    ...
End If

внутренняя часть Вашего Цикла foreach... Принятие объекта правильно переопределило, Равняется методу.

Это является, вероятно, намного более интенсивно использующим ресурсы, чем просто использование Для цикла или отслеживания текущего индекса в отдельной переменной.

я не уверен, является ли это правильным синтаксисом, это было долгое время, так как я использовал VB.

1
ответ дан Rex Morgan 13 January 2009 в 01:46
поделиться
  • 1
    Да, я вижу свою ошибку. I' ve не имел большого количества сна на этой неделе. I' ve обновил его. Спасибо за Ваш комментарий. Я ценю его. – thom 1 December 2013 в 14:52
For Each xObj In xColl
    If xObj = xColl(xColl.Count) Then ...
Next
0
ответ дан 28 November 2019 в 17:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: