vdh_ant
vdh_ant

Reputation: 13176

Custom IComparer

I'm wanting to create a IComparer<string> for a SortedDictionary<string, int> that will sort everything alphabetically but if it see a key of 'Other' it will put 'Other' at the end of the list.

Upvotes: 0

Views: 73

Answers (1)

Ani
Ani

Reputation: 113472

You mean like this?

public sealed class MyComparer : Comparer<string>
{
     public override int Compare(string x, string y)
     {
         if(x == "Other")
            return y == "Other" ? 0 : 1;

         if(y == "Other")
            return -1;

         // Change this comparer if required.
         return StringComparer.OrdinalIgnoreCase.Compare(x, y);
     }
}

Usage:

var dict = new SortedDictionary<string, int> (new MyComparer())
{ 
    { "Other", 1 }, { "aaa", 2 }, { "bbb", 3 }
};

Obviously, you can make this more generic by writing a SpecialCaseAtEndComparer<T> by:

  1. Allowing the "special" value to be injected into the comparer.
  2. Allowing the "normal" comparer to be injected into the comparer.
  3. Making the comparer work for all types, not just strings.

Upvotes: 2

Related Questions