Created attachment 23798 [details]
Run attached test case:
Mono 5.0: 500ms
Mono 2.6: 1ms
This happens because delegates have the same hash code as their delegate type:
public override int GetHashCode ()
/* same implementation as CoreCLR */
return GetType ().GetHashCode ();
So all the delegates end up in the same hash bucket. A workaround is to use a custom comparer which can provide its own hashcode.
Fixed in mono master a48bc439850869e565833d7fe6330c289beffe40.