Удалить все элементы не работает - PullRequest
12 голосов
/ 08 ноября 2011

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

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

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

Ответы [ 7 ]

44 голосов
/ 08 ноября 2011

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

listToBeRemoved.Clear();

. Для получения более подробной информации вы можете посмотреть документацию MSDN .

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

8 голосов
/ 08 ноября 2011
list.Clear()

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

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

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

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

5 голосов
/ 08 ноября 2011

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

listToBeRemoved.Clear();
3 голосов
/ 08 ноября 2011

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

Мало того, что ваш RemoveAllElements метод совершенно не нужен - он даже не работает!

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

var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
list.RemoveAllElements();
2 голосов
/ 08 ноября 2011

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

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

0 голосов
/ 19 марта 2015
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
 }
0 голосов
/ 19 марта 2015
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...