如何使用CustomedDictionary的自定义IComparer?

时间:2010-04-27 09:22:53

标签: c# icomparer sorteddictionary

我很难将自定义IComparer用于我的SortedDictionary<>。目标是将电子邮件地址以特定格式(firstnam.lastname@domain.com)作为密钥,并按姓氏排序。 当我做这样的事情时:

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

我得到这个ArgumentException: 添加第二项时An entry with the same key already exists.

之前我没有使用过SortedDictionary的自定义IComparer,我没有看到我的错误,我做错了什么?

2 个答案:

答案 0 :(得分:5)

如果2个lastNames相等,则比较整个电子邮件,例如:

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

实际上,sorteddictionary比较也用于区分键*,因此您必须指定完整的比较(不仅仅是您的排序策略)

编辑: *我的意思是在sortedDictionary中,如果Comparer给出0,则2个键是相等的

答案 1 :(得分:1)

好吧,我没有拆开你的比较器 - 但看起来它只是按姓氏进行比较,而你试图两次添加相同的姓氏(johansson)。那个应该给你一个ArgumentException

想要发生了什么 - 以及您希望您的比较器做什么?

也许您想按姓氏排序,然后按名字排序?这样你就可以拥有两个姓氏相同但姓名不同的电子邮件地址,并让它们仍然在一起,按名字排序。