Как использовать пользовательский 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("bw*@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 раньше , и я не вижу свою ошибку, что я делаю неправильно?
2 ответов
Если 2 lastNames равны, то сравниваем например написать так:
int comp = xLastname.CompareTo(yLastname);
if (comp == 0)
return x.CompareTo(y);
return comp;
на самом деле сравнение sorteddictionary также используется для различения между ключами* , поэтому вы должны указать полное сравнение (а не только свою стратегию сортировки)
изменить: * Я имею в виду, что в sortedDictionary 2 ключа равны, если Comparer дает 0
Ну, я не разобрал ваш компаратор , но похоже, что он просто сравнивает по фамилии, и вы пытаетесь добавить одну и ту же фамилию (Йоханссон) дважды. Это должны вы ArgumentException
.
что ты хочу случиться - и что ты хочу ваш компаратор сделать?
возможно, вы хотите отсортировать по фамилии и затем имя? Таким образом, вы можете иметь два адреса электронной почты с той же фамилией но разные имена, и у них все равно есть в словаре вместе, упорядоченные по имени.