c# - 在 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
解决方案
您可以通过这种方式更改您的 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。
推荐阅读
- google-app-maker - 与云 sql 一起使用时,App Maker hipaa 是否兼容
- powershell - 使用 Powershell 的 MST 转换静默运行 setup.exe
- android-ndk - 关于 Crashlytics Ndk
- python - TensorFlow 对象检测 train_config 文件错误
- swift - swift 4中未调用反向地理编码
- php - 在 PHP 循环中获取数据库表列名重复
- java - 验证单元格时,JTable 单元格编辑不会更改
- matlab - 如何解决 SVM 训练中的性能问题
- python - 如何记录 func_name 和文件名
- excel - 转换十六进制 (AF) 数字