var itemToRemove = resultlist.Single(r => r.Id==2);
resultList.Remove(itemToRemove);
Если вы не уверены, что элемент действительно существует, вы можете использовать SingleOrDefault . SingleOrDefaultвернется, nullесли предмета нет ( Singleвыдаст исключение, когда не сможет найти предмет). Оба будут выбрасывать при наличии дублированного значения (два элемента с одинаковым id).
var itemToRemove = resultlist.SingleOrDefault(r => r.Id==2);if(itemToRemove !=null)
resultList.Remove(itemToRemove);
хорошо, чем возможноvar itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
Влад
1
Не должно ли это быть resultlist.Items.RemoveAt(1);?
DreamTeK
50
Краткий ответ: Удалить (из списка results)
results.RemoveAll(r => r.ID == 2);удалит элемент с ID 2 внутри results(на месте).
Фильтр (без удаления из исходного списка results):
var filtered = result.Where(f => f.ID != 2);возвращает все элементы, кроме одного с идентификатором 2
Подробный ответ:
Я думаю, что .RemoveAll()это очень гибко, потому что вы можете иметь список идентификаторов элементов, которые вы хотите удалить - пожалуйста, посмотрите на следующий пример.
Если у вас есть:
class myClass {publicint ID;publicstringFirstName;publicstringLastName;}
и присвоил некоторые значения resultsследующим образом:
var results=newList<myClass>{new myClass(){ ID=1,FirstName="Bill",LastName="Smith"},new myClass(){ ID=2,FirstName="John",LastName="Wilson"},new myClass(){ ID=3,FirstName="Doug",LastName="Berg"},new myClass(){ ID=4,FirstName="Bill",LastName="Wilson"},};
Затем вы можете определить список идентификаторов для удаления:
Он удалит элементы 2 и 3 и сохранит элементы 1 и 4, как указано в removeList. Обратите внимание, что это происходит на месте, поэтому никаких дополнительных назначений не требуется.
Конечно, вы также можете использовать его для отдельных предметов, таких как:
Другой похожий подход (использующий предикат) заключается в использовании List.FindIndex/ List.RemoteAt(который имеет «приятную» или «не очень приятную» функцию мутации).
Правда, но будьте осторожны о том , что операция Листа является мутирует. List использует массив за кулисами, и он может воссоздать свой массив с меньшей или большей емкостью, когда он считает это необходимым. Обычно удаление является мутацией на месте существующего массива.
KeithS
Это не потокобезопасно, и для его простоты вы можете просто использовать SingleOrDefault, его не нужно содержать в статическом методе
Никто не сказал, что это потокобезопасно (и зависит ли это от того, что потоки должны делать; фактически, может быть предпочтительнее дать рабочему потоку другую конструкцию в памяти, чем позволить всем им работать в одной параллельной коллекции). ), и OP хочет получить все записи, кроме той, которая соответствует предикату, поэтому SingleOrDefault фактически вернул бы именно то, что им не нужно. «Статический метод» на самом деле является методом расширения, как и большинство Linq, и он работает всякий раз, когда то, что вам не нужно (один или несколько элементов), легче определить, чем то, что вы делаете.
KeithS
5
Есть другой подход. Он использует List.FindIndexи List.RemoveAt.
Хотя я, вероятно, использовал бы решение, представленное KeithS (просто Where/ ToList), этот подход отличается тем, что он мутирует исходный объект списка. Это может быть хорошей (или плохой) «функцией» в зависимости от ожиданий.
В любом случае, FindIndex(в сочетании с защитой) гарантирует, что RemoveAtбудет правильно, если в идентификаторах есть пробелы или неправильный порядок и т. Д., И использование RemoveAt(vs Remove) позволяет избежать повторного поиска O (n) по списку.
var itemsToRemove = resultlist.Where(r => r.Id == 2); foreach (var itemToRemove in ItemsToRemove) resultList.Remove(itemToRemove);
resultlist.Items.RemoveAt(1);
?Краткий ответ:
Удалить (из списка
results
)results.RemoveAll(r => r.ID == 2);
удалит элемент с ID 2 внутриresults
(на месте).Фильтр (без удаления из исходного списка
results
):var filtered = result.Where(f => f.ID != 2);
возвращает все элементы, кроме одного с идентификатором 2Подробный ответ:
Я думаю, что
.RemoveAll()
это очень гибко, потому что вы можете иметь список идентификаторов элементов, которые вы хотите удалить - пожалуйста, посмотрите на следующий пример.Если у вас есть:
и присвоил некоторые значения
results
следующим образом:Затем вы можете определить список идентификаторов для удаления:
И просто используйте это, чтобы удалить их:
results.RemoveAll(r => removeList.Any(a => a==r.ID));
Он удалит элементы 2 и 3 и сохранит элементы 1 и 4, как указано в
removeList
. Обратите внимание, что это происходит на месте, поэтому никаких дополнительных назначений не требуется.Конечно, вы также можете использовать его для отдельных предметов, таких как:
где он удалит Билл с ID 4 в нашем примере.
DotNetFiddle: запустить демо
источник
Есть небольшой помощник Linq, который мне нравится, его легко реализовать, и он может немного облегчить чтение запросов с условиями «где нет»:
источник
List.FindIndex
/List.RemoteAt
(который имеет «приятную» или «не очень приятную» функцию мутации).Есть другой подход. Он использует
List.FindIndex
иList.RemoveAt
.Хотя я, вероятно, использовал бы решение, представленное KeithS (просто
Where
/ToList
), этот подход отличается тем, что он мутирует исходный объект списка. Это может быть хорошей (или плохой) «функцией» в зависимости от ожиданий.В любом случае,
FindIndex
(в сочетании с защитой) гарантирует, чтоRemoveAt
будет правильно, если в идентификаторах есть пробелы или неправильный порядок и т. Д., И использованиеRemoveAt
(vsRemove
) позволяет избежать повторного поиска O (n) по списку.Вот фрагмент кода LINQPad:
Удачного кодирования.
источник
Вы не указываете, какой тип списка, но общий список может использовать либо
RemoveAt(index)
метод, либоRemove(obj)
метод:источник
Более упрощенный:
нет необходимости создавать новый объект var.
источник
... или просто
resultlist.RemoveAt(1)
если вы точно знаете индекс.источник
источник