Как реализовать специализированную перегрузку метода списка. Removeall, с параметром индекса в предикате?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как реализовать специализированную перегрузку метода списка. Removeall, с параметром индекса в предикате?

Сообщение Anonymous »

Список .Removeall является довольно полезным методом, который позволяет эффективно удалять несколько элементов из списка. К сожалению, в некоторых сценариях мне нужны были дополнительные функции, которых нет, и некоторые гарантируют, что документация не предоставляет. Он также имеет сомнительное поведение в случае, если предикат Match не удастся, что вызывает у меня беспокойство. Таким образом, в этом вопросе я прошу реализацию того же метода, в форме метода расширения, с этими функциями и характеристиками:

Вместо предиката он принимает фанк delegate, где , основанный на

Код: Выделить всё

public static int RemoveAll(this List list, Func predicate);
< /code>
он возвращает количество удаленных элементов. Я заинтересован в реализации, которая является простой и достаточно эффективной. Использование LINQ в реализации нежелательно, потому что он подразумевает распределение памяти, которых я хотел бы избежать. В случае, если предикат Match 
не удастся для элемента в середине списка, элементы, которые уже были избраны для удаления, либо не удаляются, либо они заменяются дубликатами других элементов. Во всех случаях список сохраняет свой первоначальный размер. Вот минимальная демонстрация: < /p>
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»