Сортировка по полю и проверка на равенство по другому полю в C # - PullRequest
0 голосов
/ 18 октября 2018

У меня есть такой класс

public enum RespondantRole
{
    Operator = 0,
    Supervisor = 1, 
    Director = 2
}

public class Respondant: IComparable<Respondant>
{
    public string Name { get; set; }
    public RespondantRole Role { get; set; }

    public int CompareTo(Respondant other)
    {
        return ((int)this.Role).CompareTo((int)other.Role);
    }
}

Я хочу создать SortedSet с этим классом.Но я хочу, чтобы заказ осуществлялся по ролям, т.е. операторам, руководителям и директорам.Однако, поскольку это не допускает дублирование, я хочу, чтобы проверка на равенство основывалась на уникальном поле Name.

Итак, когда я инициализирую этот набор с помощью приведенного ниже кода, я получаю правильный порядок, но только 3 элемента, так как остальные три получают повторяющиеся проблемы при последующих добавлениях.

Как мне отсортировать этот набор по ролям, в то время как уникальное ограничение основано на атрибуте Name.

public class CallCenterManager
{
    private SortedSet<Respondant> AvailableRespondants;
    public CallCenterManager()
    {
        AvailableRespondants = new ObservableSortedSet<Respondant>();
        for(int i=0; i < 10; ++i)
        {
            AvailableRespondants.Add(new Respondant() { Name = $"Operator{i}", Role = RespondantRole.Operator });
            if(i < 5)
            {
                AvailableRespondants.Add(new Respondant() { Name = $"Supervisor{i}", Role = RespondantRole.Supervisor });
            }
            if(i < 3)
            {
                AvailableRespondants.Add(new Respondant() { Name = $"Director{i}", Role = RespondantRole.Director });
            }
        }
    } 

Когда я запускаю приведенный выше код, я получаю 3 записи в наборе

{ Name = "Operator0", Role = Operator} 
{ Name = "Supervisor0", Role = Supervisor}
{ Name = "Director0", Role = Director}

Теперь это отсортировано по уровню роли, но поскольку compareTo основано на роли, следующий набор Respondant с той же ролью не вставляется.т.е. вы не видите { Name = "Operator1", Role = Operator}

Итак, как бы я хотел, чтобы вывод был

{ Name = "Operator0", Role = Operator} 
{ Name = "Operator1", Role = Operator} 
{ Name = "Operator2", Role = Operator} 
.. upto 10 entries
{ Name = "Supervisor0", Role = Supervisor}
{ Name = "Supervisor1", Role = Supervisor}
.. up to 5 entries
{ Name = "Director0", Role = Director}
.. upto 3 entries

1 Ответ

0 голосов
/ 18 октября 2018

Вы можете изменить свой CompareTo следующим образом

public int CompareTo(Respondant other)
{
    int x = ((int)this.Role).CompareTo((int)other.Role);
    if(x == 0)
        return this.Name.CompareTo(other.Name);
    else
        return x;
}

Когда вы добавляете элемент в класс SortedSet, он сразу сравнивается с другими элементами, уже находящимися внутри класса, чтобы найти точное место во внутреннем спискедержать все в порядке.Но когда вы сравниваете, используя только роль, после первых трех элементов вы начинаете возвращать 0 из вашего метода CompareTo.
SortedSet не допускает дублирование, а если вы возвращаете 0, он принимает этот результат как знак равенства между двумяэлементы и не добавляет новый элемент в свой внутренний список.

Кстати, я думаю, что вы используете класс SortedSet.Я не могу найти ObservableSortedSet в библиотеках классов.

...