Вместо предиката он принимает фанк delegate, где , основанный на
Код: Выделить всё
public static int RemoveAll(this List list, Func predicate);
< /code>
он возвращает количество удаленных элементов. Я заинтересован в реализации, которая является простой и достаточно эффективной. Использование LINQ в реализации нежелательно, потому что он подразумевает распределение памяти, которых я хотел бы избежать. В случае, если предикат Match
List list = new(Enumerable.Range(1, 15));
Console.WriteLine($"Before RemoveAll: [{String.Join(", ", list)}]");
try
{
list.RemoveAll(item =>
{
if (item == 10) throw new Exception();
bool removeIt = item % 2 == 1;
if (removeIt) Console.WriteLine($"Removing #{item}");
return removeIt;
});
}
catch (Exception ex) { Console.WriteLine(ex); }
finally
{
Console.WriteLine($"After RemoveAll: [{String.Join(", ", list)}]");
}
< /code>
Список имеет 15 номеров, и намерение состоит в том, чтобы удалить нечетные числа из списка. Предикат сбой для 10-го числа. < /P>
Выход: < /p>
Before RemoveAll: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
Removing #1
Removing #3
Removing #5
Removing #7
Removing #9
System.Exception: Exception of type 'System.Exception' was thrown.
at Program.c.b__0_0(Int32 item)
at System.Collections.Generic.List`1.RemoveAll(Predicate`1 match)
at Program.Main()
After RemoveAll: [2, 4, 6, 8, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
< /code>
Demo. < /p>
Как видно, что числа 1 и 3 были удалены, 5, 7 и 9 все еще там, и цифры 6 и 8 были дублированы (есть по два случая каждого). Наоборот, вывод, который я ожидал увидеть: < /p>
After RemoveAll: [2, 4, 6, 8, 10, 11, 12, 13, 14, 15]
< /code>
Это было бы разумное и предсказуемое поведение, на которое я мог бы рассчитывать. Он сохраняет уровни опасности на управляемом уровне. Я не рискую, например, дублирующими предметы в виртуальной корзине для покупок или дважды печатаю несколько документов PDF из выбора. Существующее поведение растягивается слишком много моих уровней комфорта. С их точки зрения нет никакой разницы между двумя вышеупомянутыми выходами (фактическим и ожидаемым). Оба одинаково повреждены, потому что оба представляют собой состояние, которое не является ни оригинальным, ни конечным/правильным состоянием после успешного выполнения. Таким образом, они не думают, что есть какая -либо ошибка, которую необходимо исправить, и они не стремятся вносить изменения, которые могут негативно повлиять на производительность успешных казней. Они также считают, что существующее поведение не удивительно или неожиданно, поэтому нет причин документировать его.
Подробнее здесь: https://stackoverflow.com/questions/750 ... with-an-in