Возможно, самый простой способ - это создать нового делегата из всех возвращающих true
:
void SignalActors()
{
SomeAction newActors = null;
foreach (SomeAction actor in Actors.GetInvocationList())
{
if (actor("Blah blah blah"))
{
newActors += actor;
}
}
Actors = newActors;
}
РЕДАКТИРОВАТЬ: Причина, по которой это проще, чем использование -=
, заключается в том, что это, очевидно, правильно с точки зрения порядка. Принимая во внимание, что +=
всегда добавляет в конец списка вызовов, -=
также убирает из конца списка вызовов ... поэтому, если вы удалите актеров в порядке forward , у вас может возникнуть проблема , Предположим, у нас есть следующие актеры:
A - returns false
B - returns true
C - returns true
A - (duplicate of the first) returns true this time
Вы должны в итоге получить {B, C, A}, но если вы вычтете A из {A, B, C, A}, вы получите {A, B, C}. Мой подход позволяет избежать этой проблемы.