Как удалить несколько объектов в списке по идентификатору?

У меня есть класс, как показано ниже

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));
Другие вопросы по тегам