Sim Exatamente, a única distinção é o fato de retornar um valor.
Simplificação (sem usar expressões):
List<T>.ForEach
Executa uma ação, não espera um resultado de retorno.
Portanto, um Action<T>
delegado seria suficiente .. diga:
List<T>.ForEach(param => Console.WriteLine(param));
é o mesmo que dizer:
List<T>.ForEach(delegate(T param) { Console.WriteLine(param); });
a diferença é que o tipo de parâmetro e a decleração de delegação são inferidos pelo uso e as chaves não são necessárias em um método embutido simples.
Enquanto que
List<T>.Where
Tem uma função, esperando um resultado.
Portanto, Function<T, bool>
seria de se esperar:
List<T>.Where(param => param.Value == SomeExpectedComparison);
que é o mesmo que:
List<T>.Where(delegate(T param) { return param.Value == SomeExpectedComparison; });
Você também pode declarar esses métodos embutidos e atribuí-los às variáveis IE:
Action myAction = () => Console.WriteLine("I'm doing something Nifty!");
myAction();
ou
Function<object, string> myFunction = theObject => theObject.ToString();
string myString = myFunction(someObject);
Eu espero que isso ajude.