Перебирайте список и удаляйте разные элементы в .NET - PullRequest
2 голосов
/ 25 октября 2009

В C ++ с использованием std::list удаление члена - это просто стирание того, на что указывает итератор. (Оператор erase возвращает следующего действительного члена списка.)

В .NET, как лучше всего перебирать список и удалять членов, которые соответствуют определенным критериям?

Ответы [ 5 ]

9 голосов
/ 25 октября 2009

List<T> имеет метод RemoveAll, который принимает предикат и удаляет элементы: http://msdn.microsoft.com/en-us/library/wdka673a.aspx

dinosaurs.RemoveAll(AddressOf EndsWithSaurus)

Private Shared Function EndsWithSaurus(ByVal s As String) _
    As Boolean
    If (s.Length > 5) AndAlso _
        (s.Substring(s.Length - 6).ToLower() = "saurus") Then
        Return True
    Else
        Return False
    End If
End Function
4 голосов
/ 25 октября 2009

Предполагая, что у вас есть List<T>, один эффективный способ - это перебирать список в обратном порядке, удаляя элементы по ходу:

for(int i = myList.Count-1; i--; i>=0)
{
    if (ShouldBeRemoved(myList[i]))
    {
        myList.RemoveAt(i);
    }
}

Если вместо этого у вас есть IEnumerable<T>, это становится сложнее, так как вы не можете изменить список во время итерации.

2 голосов
/ 25 октября 2009

В .NET вы не можете изменять базовую коллекцию во время итерации с помощью перечислителя. Итак, у вас есть варианты:

  • итерация по списку с хорошей петлей for(;;);

  • создать новый список без элементов, соответствующих вашим критериям:

    var list1 = ...; var list2 = list1.Where (элемент =>! критерий (элемент)). ToList ();

(я использовал C # для этого примера, но вы должны быть в состоянии преобразовать его в VB).

1 голос
/ 25 октября 2009

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

Но вот печенье: http://www.koders.com/csharp/fidF2C8E1786AE76101911914CCA9286E25B398AED6.aspx?s=textbox

«Позволяет вам изменять базовую коллекцию в середине foreach»

0 голосов
/ 27 октября 2013

А как же:

    Dim lst As New List(Of String)

    While lst.Count > 0
        lst.RemoveAt(0)
    End While

другое решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...