Как удалить несколько объектов в списке по идентификатору?
У меня есть класс, как показано ниже
class MyClass
{
public string id { get; set; }
public string data { get; set; }
}
У меня есть массив идентификаторов, которые мне нужно удалить:
List<myClass> myObjArray = new List<myClass>;
myClass myObj1 = new myClass { id = "1", data = "aaa"};
myClass myObj2 = new myClass { id = "2", data = "bbb"};
myClass myObj3 = new myClass { id = "3", data = "ccc"};
myClass myObj4 = new myClass { id = "4", data = "ddd"};
myObjArray.Add(myObj1);
myObjArray.Add(myObj2);
myObjArray.Add(myObj3);
myObjArray.Add(myObj4);
string [] idToBeRemove = {"1", "3"};
Есть ли способ удалить myObj в myObjArray, где идентификатор находится в строке idToBeRemove?
4 ответа
List<T>
есть метод RemoveAll
который выполнит то, что вам нужно. В отличие от делать что-то вроде Where(...).ToList()
, он изменит существующий список на месте, а не создаст новый.
myObjArray.RemoveAll(item => idToBeRemove.Contains(item.id));
Обратите внимание, что по мере роста массива элементов для удаления вы захотите перейти к чему-то более производительному, например HashSet<T>
хотя с вашим текущим счетом 2, это не является насущной необходимостью.
Richardissimo также предлагает хорошее предложение в комментариях к вашему вопросу о том, когда основной список растет, Dictionary<K, V>
может быть полезным. Опять же, не насущная необходимость с небольшим списком, но что-то, о чем нужно помнить, когда оно растет и если производительность является проблемой.
Удалить из существующего List
Вы можете использовать List.RemoveAll (Predicate):
myObjArray.RemoveAll(r => idToBeRemove.Contains(r.id));
Чтобы получить результат в новой коллекции, вы можете использовать Enumerable.Where и Enumerable.Contains:
var result = myObjArray.Where(m => !idToBeRemove.Contains(m.id)).ToList();
var result = myObjArray.Where(m => !idToBeRemove.Contains(m.id)).ToList();
foreach (var item in result)
{
myObjArray.Remove(item);
}
Используйте это, чтобы удалить идентификатор:
myObjArray.RemoveAll(item => idToBeRemove.Contains(item.id));