Вопрос

У меня есть трудности, чтобы использовать свой пользовательский Imparer для моего сортирования <>. Цель состоит в том, чтобы поставить адреса электронной почты в определенном формате (firstname.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);
  }
}

Я получаю этот аргумент:An entry with the same key already exists. при добавлении второго элемента.

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

Это было полезно?

Решение

Если 2 фамилии равны, а затем сравните, например, весь адрес электронной почты, как:

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

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

Редактировать: * Я имею в виду в SortedDictionary 2 ключей равны, если сравнительнее дает 0

Другие советы

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

Что ты сделал хочу случиться - а что ты хочу Ваш компаратор делает?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top