C# 按字段排序,并按C中的另一个字段检查是否相等#

C# 按字段排序,并按C中的另一个字段检查是否相等#,c#,collections,sortedset,C#,Collections,Sortedset,我有一节这样的课 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 in

我有一节这样的课

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);
    }
}
当我运行上述代码时,我在集合中得到3个条目

{ Name = "Operator0", Role = Operator} 
{ Name = "Supervisor0", Role = Supervisor}
{ Name = "Director0", Role = Director}
现在,这是根据角色级别进行排序的,但由于
compareTo
是基于角色的,因此不会插入具有相同角色的下一组
响应者。
i、 e.您没有看到
{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

你可以用这种方法把比较器换成

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类。我在类库中找不到ObserviesOrtedSet。

如果我理解得很好,您需要两个级别的排序,首先是按角色,然后是按名称?我不太理解您所说的“而唯一约束基于name属性”是什么意思。您指的是什么“名称属性”?我没有看到代码中设置了任何属性。您是指
名称
属性吗?如果是这样的话,因为它们都有唯一的名称,那么您到底在寻找什么?您的意思是希望首先通过
Role
进行比较,然后通过
Name
进行比较?是否希望按角色分组,然后按名称排序?请提供示例输入和输出,以便我们了解您的目标。更新请检查谢谢您的工作
observesOrtedSet
是我正在开发的一个扩展。我忘了把它和SortedSet交换以显示在这里。
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;
}