Pregunta

Estoy teniendo dificultades para usar mi IComparer personalizado para mi SortedDictionary <>. El objetivo es poner direcciones de correo electrónico en un formato específico (firstnam.lastname@domain.com) como la clave, y ordenar por apellido. Cuando hago algo como esto:

public class Program
{
  public static void Main(string[] args)
  {
    SortedDictionary<string, string> list = new SortedDictionary<string, string>(new SortEmailComparer());
    list.Add("a.johansson@domain.com", "value1");
    list.Add("b.johansson@domain.com", "value2");
    foreach (KeyValuePair<string, string> kvp in list)
    {
      Console.WriteLine(kvp.Key);
    }
    Console.ReadLine();
  }
}

public class SortEmailComparer : IComparer<string>
{
  public int Compare(string x, string y)
  {
    Regex regex = new Regex("\\b\\w*@\\b",
                        RegexOptions.IgnoreCase
                        | RegexOptions.CultureInvariant
                        | RegexOptions.IgnorePatternWhitespace
                        | RegexOptions.Compiled
                        );

    string xLastname = regex.Match(x).ToString().Trim('@');
    string yLastname = regex.Match(y).ToString().Trim('@');
    return xLastname.CompareTo(yLastname);
  }
}

Me conseguir este ArgumentException: An entry with the same key already exists. al añadir el segundo elemento.

No he trabajado con un IComparer personalizado para un SortedDictionary antes, y dejar de ver mi error, ¿qué estoy haciendo mal?

¿Fue útil?

Solución

Si los 2 apellidos que son iguales, entonces se comparan, por ejemplo, todo el correo electrónico como:

int comp = xLastname.CompareTo(yLastname);
if (comp == 0)
   return x.CompareTo(y);
return comp;

En realidad, la comparación SortedDictionary también se utiliza para distinguir entre las teclas *, por lo que debe especificar una comparación completa (no sólo su estrategia de clasificación)

EDIT: * Es decir, en SortedDictionary 2 llaves son iguales si Comparer da 0

Otros consejos

Bueno, no he desmontado el comparador - pero parece que es sólo la comparación por el apellido, y que está tratando de agregar el mismo apellido (Johansson) dos veces. Que debe le dará una ArgumentException.

Lo que hizo que desee a pasar? - y lo que do quiera su comparador hacer

Tal vez desea ordenar por apellido y luego nombre ? De esa manera se pueden tener dos direcciones de correo electrónico con el mismo apellido pero con diferentes nombres, y hacer que todavía estén en el diccionario juntos, ordenados por nombre.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top