Теперь я пришел на сцену, чтобы получить все мои данные в виде списка в кеше (объектах), и следующее, что мне нужно сделать, это удалить некоторые экземпляры из списка.
Обычно я делал бы удаление следующим образом:
List<T> list;
List<T2> toBeRemovedItems;
// populate two lists
foreach(T2 item in toBeRemovedItems)
{
list.Remove(delegate(T one) {
// build a condition based on item
// return true or false
});
}
Чтобы быть более конкретным, я фактически создаю или заполняю список toBeRemvoedItems динамического класса (а не формальный определенный класс). Например, класс T является чем-то вроде MyClass, а коды для удаления:
class MyClass<C> {
public string Value1 { get; set; }
public int Value2 { get; set; }
public C ObjectC { get; set; }
}
....
List<MyClass<C>> list;
// populate list
// populate toBeRemovedItems. Here is an example of hard-coded codes:
var toBeRemovedLItems = new[] {
new { Value1="a", Value2 = 1},
new { Value2="x", Value2 = 10},
...
};
// toBeRemovedItems may be the result of Select from a collection
foreach(var item in toBeRemovedLItems)
{
list.Remove(delegate(MyClass one) {
return one.Value1 = item.Value1 && one.Value2 < item.Value2;
});
}
Я попытался найти метод Remove()
в интерфейсе IEnumerable
из MSDN, но я не могу найти там метод Remove()
(имеет смысл, что IEnumerable
используется только для перечисления). В классе List имеется несколько перегруженных методов Remove(...)
. Я не уверен, есть ли альтернативные способы удаления элементов из списка с помощью выражений LINQ или Lambda?
Кстати, я подумал о том, как сделать запрос против списка, чтобы получить подмножество или новый список IEnumerable
с условиями Where, аналогичными перемещающимся элементам из списка. Тем не менее, я предпочитаю удалять элементы из моего кэшированного списка, и в некоторых случаях я просто не могу использовать свойство списка reset в классе для нового списка (например, частный набор).