Да Точно, единственное различие - факт, что это возвращает значение.
Упрощение (без использования выражений):
List<T>.ForEach
Принимает меры, не ожидает возврата.
Так что Action<T>
делегата было бы достаточно .. сказать:
List<T>.ForEach(param => Console.WriteLine(param));
это то же самое, что сказать:
List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });
Разница в том, что тип параметра и его делегирование определяются с помощью использования, и для простого встроенного метода скобки не требуются.
В то время как
List<T>.Where
Принимает функцию, ожидая результата.
Так Function<T, bool>
что можно ожидать:
List<T>.Where(param => param.Value == SomeExpectedComparison);
что так же, как:
List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });
Вы также можете объявить эти методы встроенными и присвоить их переменным IE:
Action myAction = () => Console.WriteLine("I'm doing something Nifty!");
myAction();
или
Function<object, string> myFunction = theObject => theObject.ToString();
string myString = myFunction(someObject);
Надеюсь, это поможет.