Как использовать пользовательский 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. при добавлении второго объекта.

Я не работал с пользовательским IComparer для SortedDictionary прежде, и мне не удается видеть мою ошибку, что я делаю неправильно?

11
задан Magnus Johansson 27 April 2010 в 09:22
поделиться

2 ответа

Если 2 lastNames равны, то сравните, например, все письмо, например:

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

На самом деле, сравнение sorteddictionary также используется для различения ключей *, поэтому вы должны указать полное сравнение (не только вашу стратегию сортировки)

РЕДАКТИРОВАТЬ: * Я имею в виду, что в sortedDictionary 2 ключа равны, если Comparer дает 0

5
ответ дан 3 December 2019 в 11:20
поделиться

Ну, я не разбирал ваш компаратор, но похоже, что он просто сравнивает по фамилии, а вы пытаетесь добавить одну и ту же фамилию (Йоханссон) дважды. должен дать вам ArgumentException .

Что вы хотели, чтобы произошло - и что вы хотите, чтобы ваш компаратор делал?

Возможно, вы хотите отсортировать по фамилии , а затем по имени ? Таким образом, у вас может быть два адреса электронной почты с одинаковой фамилией, но разными именами, и они все еще будут вместе в словаре, отсортированные по имени.

1
ответ дан 3 December 2019 в 11:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: