首页 > 解决方案 > 在 C# 中按字段排序并通过另一个字段检查是否相等

问题描述

我有这样的课

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

标签: c#collectionssortedset

解决方案


您可以通过这种方式更改您的 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 类时,它会立即与该类中已有的其他元素进行比较,以找到内部列表中的确切位置以保持所有内容排序。但是,当您仅使用角色进行比较时,在前三个元素之后,您开始从 CompareTo 方法返回 0。
SortedSet 不允许重复,如果您返回 0,它将将此结果视为两个元素之间相等的符号,并且不会将新元素添加到其内部列表中。

顺便说一句,我认为您正在使用 SortedSet 类。我在类库中找不到 ObservableSortedSet。


推荐阅读