I'm not familiar with C# but the syntax looks reasonably similar to the JS case of which I am familiar. Simply, "(a...) => {}" returns a function, taking parameter list (a...) and executing statements {}.
It's a handy shorthand; often you want a quick one-liner callback function, like, well for some event handlers as above for example; but also for specifying how to sort an array for example. In that case, the sort() function passes two elements at a time to your lambda, which returns some representation of the ordering of those elements (like for numeric or string arguments, (a, b) => return a < b;).
You can of course use a function object definition (at least in JS, but C# probably has something similar?..), it's just syntactic sugar for "function(a, b) {statements...}".
The basic idea, of function pointers/references, is extremely old; plain old C has them (the declaration of which looks... bizarre, but, it is what it is), though obviously not anonymous functions and lambdas. (Kind of odd actually, in that most types are generalized in that sort of way -- you can have anonymous inner types/unions/structs, but not functions.) It's just a nice feature to add.
That's the basics. The harder stuff comes when using variables outside of local scope. You can reference variables in the parent function, to varying degrees of success/effect depending on language. Usually, copies are made either when declaring the lambda, or as the function drops out of scope, so that the values can still be used by the lambda without mucking up the stack or whatever (since, for example in C, non-static local function variables are stored on the stack, and therefore a naive lambda would point at now-out-of-scope stack that could be anything).
Tim