Come utilizzare IComparer personalizzato per SortedDictionary?
-
01-10-2019 - |
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?
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.