2010-04-27 5 views
7

Ho difficoltà ad utilizzare il mio IComparer personalizzato per il mio SortedDictionary <>. L'obiettivo è inserire gli indirizzi e-mail in un formato specifico ([email protected]) come chiave e ordinare per cognome. Quando faccio qualcosa di simile:Come utilizzare IComparer personalizzato per SortedDictionary?

public class Program 
{ 
    public static void Main(string[] args) 
    { 
    SortedDictionary<string, string> list = new SortedDictionary<string, string>(new SortEmailComparer()); 
    list.Add("[email protected]", "value1"); 
    list.Add("[email protected]", "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 la seconda voce.

Non ho ancora lavorato con un compendio IComparer personalizzato per un SortedDictionary e non riesco a vedere il mio errore, cosa sto facendo male?

risposta

4

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 l'ordinamento strategia)

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

+0

Grazie. Questa era la soluzione semplice ed elegante. –

1

Beh, non ho smontato il tuo comparatore - ma sembra che si stia confrontando per cognome, e stai cercando di aggiungere lo stesso cognome (johansson) due volte. Che dovrebbe darti un ArgumentException.

Cosa hai desidera ciò accada - e che cosa si vuole vostro operatore di confronto di fare?

Forse si desidera ordinare per cognome e quindi il nome? In questo modo puoi avere due indirizzi email con lo stesso cognome ma nomi diversi e averli ancora nel dizionario insieme, ordinati per nome.

+0

Infatti, le vostre supposizioni sono corrette. @digEmAll ha fornito la soluzione che volevo, e @Foxfire ha spiegato perché. –

Problemi correlati