July
10

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.

kick it on DotNetKicks.com

Something to say?

Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.