il predicate<string> è una funzione anonima che data una stringa in input ritorna un valore booleano.

(s => s == "pippo");

è un predicate che ritorna true se la stringa s è uguale a "pippo", quindi è un Predicate<string>, la variabile s è l'argomento di input. Non c'è bisogno del cast (Predicate<string>) perche il compilatore lo evince dal tipo di array che la sta usando Se si osse trattato di un array di int s sarebbe di tipi int e il predicate sarebbe stato un Predicate<int>. Se inizi a scriverla, infatti, e ti avvicini con il mouse alla variabile s da visual studio vedrai che Intellisense ti dice gia che s è di tipo string anche senza il cast.
Il corpo vero e proprio della funzione si trova a destra dell'operatore => e visto che deve ritornare implicitamente un booleano deve trattarsi di un test (s == "pippo"). A sinistra dell'operatore => si trova il parametro di input a cui dai un nome a piacere, nel tuo caso s.

La comodità è data dal fatto che è possibile scrivere al volo dei delegate da dare in pasto ad un altra funzione che ne farà uso senza scrivere chissà quanto codice.

La sintassi, al di la del fatto che dovresti eliminare i cast, sembra giusta perciò l'unico modo per aiutarti è quello di capire che tipo di errori in particolare stai avendo.