2015-10-15 2 views
0

У меня есть список значений, все это комбинация букв и цифр, чтобы сделать удостоверение личности, однако в некоторых случаях это может просто быть 0.Удалить Конкретное значение из списка В VB.NET

Мне нужно, чтобы удалить все случаи, когда это 0.

Я пытался что-то вроде

For i = 0 the list.count - 1 
    If list(i) = "0" Then 
     list.RemoveAt(j) 
    End If 
Next 

Но это бросает аргумент из исключения диапазона в конце, потому что цикл продолжается, и я могу 't использовать Exit For, потому что мне нужно проверить несколько нулей.

Я не очень хорошо разбираюсь в выражениях Ламды, которые, кажется, делают то, что я хочу, и не понимаю их, поэтому, если кто-то может дать и объяснить то, что будет работать, это будет блестящим.

+0

вы можете переключить его на время цикла и только увеличиваем свой контур управления, если вы НЕ удалить из списка. –

ответ

2

Начать с конца списка и идти в обратном направлении 0

For i = list.count - 1 to 0 Step -1 
    If list(i) = "0" Then 
     list.RemoveAt(j) 
    End If 
Next 

Если вы хотите использовать LINQ с использованием лямбда Где держать все элементы, которые не равны «0» и воссоздавать список с ToList

list = list.Where(function(value) value <> "0").ToList 

лямда в этом случае такой же, как

Function IsNotZero(value As String) As Boolean 
    return value <> "0" 
End Function 
2

Хитрость заключается в том, чтобы петля назад

For i = thelist.count - 1 to 0 step -1 

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

5

с использованием LINQ или лямбда-выражения будут довольно простым решением этой проблемы.

Интерфейс IEnumerable (Of T) содержит метод, называемый RemoveAll. Эта функция может показаться немного сложной, потому что она принимает довольно неприятный параметр, но на самом деле это не так плохо, как кажется.

Таким образом, параметр, переданный в RemoveAll, может быть анонимной функцией или адресом функции. Для этого случая анонимная функция - путь.

Чтобы удалить все объекты из списка строк, где выполняется условие вы можете использовать:

list.RemoveAll(Function(o) o="0") 

Эта короткая строка кода фактически делает довольно много вещей. Сначала он создает анонимную функцию, которая принимает строку как параметр и возвращает результат сравнения этой строки с литералом «0». Далее функция RemoveAll использует эту анонимную функцию для оценки всех членов list и удаляет объект, если анонимная функция оценивает значение true.

Альтернатива:

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

Мы по-прежнему вызываем функцию remove all, как и раньше, но на этот раз мы передаем адрес функции, которая имеет подпись, похожую на Public Function <FunctionName>(byval Param As String) As Boolean, если подпись не соответствует, тогда вы получите сообщение об ошибке.

List.RemoveAll(AddressOf TestFunction) 

Далее мы определяем функцию в другом месте программы.

Public Function TestFunction(ByVal item As String) As Boolean 
    return item = "0" 
End Function 
0

Другой подход может создать новый список, который не содержит «0» -значения

Dim newlist As List(Of String) = list.Where(function(v) v.Equals("0") = false).ToList()