Pergunta

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.

Foi útil?

Solução

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top