Sí. Exactamente, la única distinción es el hecho de que devuelve un valor.
Simplificación (sin usar expresiones):
List<T>.ForEach
Toma una acción, no espera un resultado de retorno.
Entonces un Action<T>
delegado sería suficiente ... diga:
List<T>.ForEach(param => Console.WriteLine(param));
es lo mismo que decir:
List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });
la diferencia es que el tipo de parámetro y la declinación delegada se infieren por el uso y no se requieren llaves en un método simple en línea.
Donde como
List<T>.Where
Toma una función, esperando un resultado.
Entonces Function<T, bool>
se esperaría un:
List<T>.Where(param => param.Value == SomeExpectedComparison);
que es lo mismo que:
List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });
También puede declarar estos métodos en línea y asignarlos a las variables IE:
Action myAction = () => Console.WriteLine("I'm doing something Nifty!");
myAction();
o
Function<object, string> myFunction = theObject => theObject.ToString();
string myString = myFunction(someObject);
Espero que esto ayude.