Domanda

Sto avendo difficoltà ad usare il mio IComparer personalizzato per il mio SortedDictionary <>. L'obiettivo è quello di mettere indirizzi e-mail in un formato specifico (firstnam.lastname@domain.com) come la chiave, e ordinare per cognome. Quando faccio qualcosa di simile:

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);
  }
}

ottengo questo ArgumentException: An entry with the same key already exists. quando si aggiunge il secondo elemento.

Non ho lavorato con un IComparer personalizzato per un SortedDictionary prima, e non riesco a vedere il mio errore, quello che sto facendo di sbagliato?

È stato utile?

Soluzione

Se i 2 lastnames sono uguali quindi confrontare per esempio tutta la posta elettronica come:

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

In realtà, il confronto SortedDictionary è anche utilizzato per distinguere tra i tasti *, quindi è necessario specificare un confronto completo (non solo la vostra strategia di ordinamento)

EDIT: * Voglio dire in SortedDictionary 2 chiavi sono uguali se Comparer dà 0

Altri suggerimenti

Beh, non ho smontato il vostro operatore di confronto - ma sembra che è solo il confronto in base al cognome, e si sta cercando di aggiungere lo stesso cognome (Johansson) due volte. Quella dovrebbe vi darà un ArgumentException.

Quello che hai fatto voler per accadere? - e che cosa voglio il tuo operatore di confronto per fare

Forse si desidera ordinare per cognome e quindi nome ? In questo modo si possono avere due indirizzi e-mail con lo stesso cognome, ma diversi nomi di primo, e li hanno ancora nel dizionario insieme, ordinati per nome.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top