За исключением того, что вы изменили бы список на месте, а не возвращали новый, это всего лишь вызов .ForEach()
.
Чтобы действительно понять, как это работает, подумайте больше о IEnumerable
с, чем списках. Подумайте, почему два приведенных ниже выражения имеют одинаковый результат и , почему последнее обычно предпочтительнее:
MyEnumerable.Count() > 2
MyEnumerable.Skip(2).Any()
Чтобы помочь в этом, заново внедрите некоторые стандартные расширения IEnumerable, используя ключевое слово C # yield
. Как только вы действительно поймете, почему 2-й результат лучше, вы должны быть в хорошей форме.
Что касается различных базовых типов делегатов, вам просто нужно изучить их. Думайте о Func
как о вашем основном общем делегате, где вы указываете тип аргумента и тип возвращаемого значения для параметров универсального типа. Затем представьте Action
как особый случай Func
, где тип возвращаемого значения void, и Predicate
как особый случай, когда тип возвращаемого значения bool.