2010-04-27 4 views
7

내 SortedDictionary <>에 내 사용자 지정 IComparer를 사용하는 데 어려움이 있습니다. 목표는 전자 메일 주소를 특정 형식 ([email protected])으로 키로 지정하고 성으로 정렬하는 것입니다. 나는 이런 식으로 뭔가 할 때 는 :SortedDictionary에 대한 사용자 지정 IComparer를 사용하는 방법?

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

을 나는이 ArgumentException이 얻을 : An entry with the same key already exists. 두 번째 항목을 추가 할 때.

이전에 SortedDictionary에 대한 사용자 지정 IComparer로 작업하지 않았으며 오류가 표시되지 않습니다. 무엇이 잘못 되었나요?

답변

4

2 라스트 네임은 다음과 같은 예를 들어 전체 이메일을 동일하게 비교하는 경우 :

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

사실, sorteddictionary 비교 또한 (뿐만 아니라 완전한 비교를 지정해야합니다, 그래서 * 키 사이에 구별하는 데 사용됩니다 당신의 정렬 전략)

편집 : * 나는 비교 자 당신의 가정이 올바른지, 실제로 0

+0

감사. 이것은 단순하고 우아한 해결책이었습니다. –

1

음, 필자는 비교자를 분해하지 않았지만 성으로 비교하는 것만 큼 같은 성 (조핸슨)을 두 번 추가하려고합니다. 일 때 ArgumentException이되어야합니다.

을 원했을 뿐이며 은 (는) 할 사람이 무엇입니까?

아마 으로 정렬하고 다음으로 이름을으로 정렬하고 싶습니까? 그렇게하면 성이 같지만 이름이 다른 두 개의 전자 메일 주소를 가질 수 있으며 이름이 순서대로 함께 사전에 포함됩니다.

+0

를 제공하는 경우 sortedDictionary 2 키가 동일한 의미한다. @digEmAll이 내가 원하는 솔루션을 제공하고 @Foxfire가 이유를 설명했습니다. –

관련 문제