Подтвердить что ты не робот

Удалить все неработающие элементы

Я заметил эту функцию в .NET-проекте, над которым я работаю.

    private static void RemoveAllElements(ref List<int> listToBeRemoved)
    {
        foreach (var i in listToBeRemoved)
        {
            listToBeRemoved.Remove(i);
        }
    }

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

4b9b3361

Ответ 1

Я не понимаю, почему вы не могли просто упростить его до

listToBeRemoved.Clear();

Подробную информацию о документации MSDN можно найти здесь.

Я не думаю, что вам нужно добавить логику обработки исключений. Метод Clear внутренне использует Array.Clear, который как контракт надежности Success и WillNotCorruptState. Я не мог себе представить, как это могло бы вызвать исключение.

Ответ 2

list.Clear()

См. документацию: http://msdn.microsoft.com/en-us/library/dwb5h52a.aspx

Изменение коллекции, которую вы перечисляете, делает перечислитель недействительным, так что это очень плохая практика. См. Замечания List.GetEnumerator:

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

Сам метод Clear не будет генерировать исключение, но если listToBeRemoved - null, вы получите NullReferenceException.

Ответ 3

почему бы и нет:

listToBeRemoved.Clear();

Ответ 4

Как насчет встроенного метода Clear?

Не только ваш метод RemoveAllElements совершенно не нужен - он даже не работает!

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

var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list.RemoveAllElements();

Ответ 5

Самый быстрый способ - listToBeRemoved.Clear().

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

Ответ 6

static void Main (){
List<string> words = new List<string>();
words.AddRange(new[] { "banana", "plum", "peach" });

condition = words.Count;
for (int i = 0; i < condition; i++) words.RemoveAt(0);}
//it returns empty list

Ответ 7

static void Main ()
{
    List<string> words = new List<string>();
    words.AddRange(new[] { "banana", "plum", "peach" });
    words.RemoveAll(s=>s.Any());//This code returns empty list
 }