Сведения о вопросе

Kirushaa

17:41, 29th August, 2020

Теги

.net    

Удаление N элементов из списка условно

Просмотров: 443   Ответов: 6

Я писал некоторый элемент управления ASP.NET , когда пришел к сценарию, в котором мне нужно было удалить элементы из списка, только когда они соответствовали определенному условию.

Метод RemoveAll универсального класса List выполняет хорошую работу, но удаляет все элементы, соответствующие условию, указанному предикатом.

Что делать, если я хочу удалить только определенное количество элементов, определяющих условие? Как вы думаете, как лучше всего это сделать?



  Сведения об ответе

SILA

05:19, 16th August, 2020

Если вы хотите указать как ограничение на количество удаляемых элементов, так и условие выбора удаляемых элементов, вы можете использовать этот подход:

int limit = 30; // Suppose you want to remove 30 items at most
list.RemoveAll(item => ShouldIRemoveThis(item) && limit-- > 0);


  Сведения об ответе

ASSembler

14:39, 12th August, 2020

@buyutec

Вместо

list.RemoveAll(item => ShouldIRemoveThis(item));

Вы можете использовать:

list.RemoveAll(ShouldIRemoveThis);

lambda имеет ту же сигнатуру, что и метод, поэтому они эквивалентны, поэтому вы можете просто передать метод напрямую.


  Сведения об ответе

ASSembler

10:30, 6th August, 2020

Если метод не предоставляет параметр "limit" (чего в нем нет), то лучше всего использовать простой цикл, который удаляет совпадающие элементы, прерываясь, когда ваш инкрементированный "match counter" достигает вашего предела.

Это в значительной степени то, как работает внутренняя функция в любом случае, но в более оптимизированном виде.


  Сведения об ответе

lesha

22:48, 27th August, 2020

В framework 3.5 метод RemoveAll принимает предикат в качестве параметра. Так что вы можете использовать

list.RemoveAll(item => ShouldIRemoveThis(item));

где ShouldIRemoveThis-это метод, который возвращает логическое значение, указывающее, должен ли элемент быть удален из списка.


  Сведения об ответе

PHPH

16:25, 15th August, 2020

Вы можете использовать LINQ? Если да, то вы можете просто использовать его .Take() метод и укажите, сколько записей вы хотите (возможно, как total-N).


  Сведения об ответе

Chhiki

08:02, 3rd August, 2020

Здесь полезны анонимные делегаты. Простой пример для удаления первых предельных четных чисел из списка.

List<int> myList = new List<int>;
for (int i = 0; i < 20; i++) myList.add(i);

int total = 0;
int limit = 5;
myList.RemoveAll(delegate(int i) { if (i % 2 == 0 && total < limit) { total++; return true; } return false; });

myList.ForEach(i => Console.Write(i + " "));

Дает 1 3 5 7 9 10 11 12 13 14 15 16 17 18 19, как мы хотим. Достаточно легко обернуть это в функцию, подходящую для использования в качестве выражения lambda, принимая реальный тест в качестве параметра.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться