Удалить все неработающие элементы
Я заметил эту функцию в .NET-проекте, над которым я работаю.
private static void RemoveAllElements(ref List<int> listToBeRemoved)
{
foreach (var i in listToBeRemoved)
{
listToBeRemoved.Remove(i);
}
}
Это самый быстрый способ удалить все элементы из списка? Я также заметил, что эта функция не устраняет никаких исключений. Должен ли я это изменить? Это в существующем коде.
Ответы
Ответ 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
}