Как удалить несколько объектов в списке по идентификатору? - PullRequest
0 голосов
/ 28 ноября 2018

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

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, гдеid находится в строке idToBeRemove?

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Используйте это, чтобы удалить идентификатор:

myObjArray.RemoveAll(item => idToBeRemove.Contains(item.id));
0 голосов
/ 28 ноября 2018
  var result = myObjArray.Where(m => !idToBeRemove.Contains(m.id)).ToList();
            foreach (var item in result)
            {
                myObjArray.Remove(item);
            }
0 голосов
/ 28 ноября 2018

List<T> имеет метод RemoveAll, который выполнит то, что вам нужно.В отличие от Where(...).ToList(), он будет изменять существующий список вместо создания нового.

myObjArray.RemoveAll(item => idToBeRemove.Contains(item.id));

Обратите внимание, что по мере роста массива элементов для удаления вы захотите перейти к чему-то более производительному, например, HashSet<T>, хотя при текущем значении 2 это ненасущная необходимость.

@ Richardissimo также предлагает хорошее предложение в комментариях к вашему вопросу о том, что когда основной список растет, Dictionary<K, V> может быть полезным.Опять же, не насущная необходимость с небольшим списком, но что-то, о чем нужно помнить, когда оно растет и если производительность является проблемой.

0 голосов
/ 28 ноября 2018

Для удаления из существующего 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();
...