Finally, a Good Reason for an Extension Method
Several months have passed since people starting using C# 3.0 out there. I, however, was busy with linear algebra, discrete math and such at that time.
I did, however, try to keep up and see what’s the fuss about extension methods, but I never got it. I mean, this is anti-encapsulation at it best - break into any type, do whatever you feel like. Total chaos.
So I gave it some time. I didn’t force it into any of my projects until the time was right. Then I finally got it - extension methods are ideal for little pieces of code which you need, but creating a utility class for them feels wrong.
For example, I was implementing a new feature for Regionerate a couple of days ago in which I had to sort a list, split it into distinct values and recursively sort it again.
Its a reflection-based sort and it has quite a bit of logic in it, so it had a class & unit tests just for it. I had to take care of the splitting thingy, but it felt wrong to add it as a method in the sort class, as it operates on lists. It really feels like a method that should run on IList<T>.
Subclassing List<T> for the job feels wrong - c’mon, how would you pitch such a class? “It’s a list that you can split!”. Unpersuasive.
That’s how I got it: If IList<T> was built especially for Regionerate, it would have had a reflection-based Split function, but since its not, I should implement it as an extension method.
Took me 2 minutes and works like a charm.
1: public static IDictionary<object, IList<T>> Slice<T>(
2: this IList<T> list, PropertyInfo propertyInfo)
3: {
4: IDictionary<object, IList<T>> slices =
5: new Dictionary<object, IList<T>>();
6: foreach (T t in list)
7: {
8: // Get the value of propertyInfo.
9: object value = propertyInfo.GetValue(t, null);
10:
11: // Add it to slices.
12: if (slices.Keys.Contains(value))
13: {
14: // slices already has a slice for this value.
15: slices[value].Add(t);
16: }
17: else
18: {
19: // there is no slice for this value
20: // inside slices, create a new slice.
21: IList<T> newSlice = new List<T>();
22: newSlice.Add(t);
23: slices.Add(value, newSlice);
24: }
25: }
26:
27: return slices;
28: }
A fully documented, well-aligned version of this extension method is freely available here.