C# will infer lambda argument types from context, yes. So the code given:
return Iterables.filter(employees, {Employee e -> e.isPartTime()});
Would be in C# (Since you'd also omit the { } and use "=>" not "->") something like this: return Iterables.filter(employees, e => e.isPartTime());
And it is a better C# idiom to make "filter" an extension method on IEumerable<T>. return employees.filter(e => e.isPartTime());
In fact, the existing extension method "Where()" is what you want. return employees.Where(e => e.isPartTime());
C# has had this for about 2 years now. And it is good. So, I'm looking at your code, and back to mine. Mine is shorter but still very readable (to me anyway). And it stays readable when you chain methods, e.g. return employees.Where(e => e.isPartTime()).ToArray();
I'll stay with mine right now.