2010-04-27 23 views
7

Mam trudności z używaniem mojego niestandardowego programu IComparer dla mojego SortedDictionary <>. Celem jest umieszczenie adresów e-mail w określonym formacie ([email protected]) jako klucza i sortowanie według nazwiska. Kiedy zrobić coś takiego:Jak używać niestandardowego programu IComparer dla 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); 
    } 
} 

otrzymuję ten ArgumentException: An entry with the same key already exists. podczas dodawania drugiego elementu.

Nie pracowałem wcześniej z niestandardowym programem IComparer dla SortedDictionary i nie widzę mojego błędu, co robię źle?

Odpowiedz

4

Jeżeli 2 lastNames są równe następnie porównać na przykład cały e-mail jak:

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

Właściwie SortedDictionary porównanie jest również używany do rozróżnienia między klawiszami *, więc należy podać pełną porównania (nie tylko swój sortowanie strategia)

EDIT: * znaczy w SortedDictionary 2 klucze są równe jeśli porównywarka daje 0

+0

Dzięki. To było proste, eleganckie rozwiązanie. –

1

Cóż, nie rozebrałem twojego porównywalnika - ale wygląda na to, że to tylko porównanie według nazwiska i próbujesz dodać to samo nazwisko (johansson) dwa razy. To powinno dać ci ArgumentException.

Co się stało, że chcesz, aby się stało - i co chcesz chcesz Twój porównań zrobić?

Być może chcesz sortować według nazwiska , a następnie imię? W ten sposób możesz mieć dwa adresy e-mail o tym samym nazwisku, ale o różnych imionach i nadal będą one w słowniku razem, uporządkowane według imienia.

+0

Rzeczywiście, wasze założenia są prawidłowe. @digEmAll dostarczył rozwiązanie, którego szukałem, a @Foxfire wyjaśniło, dlaczego. –