按字段排序并检查 C# 中另一个字段是否相等
Sort by a field and check for equality by another field in C#
我有一个class这样的
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);
}
}
我想用这个 class 创建一个 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 class 时,它会立即与 class 中已有的其他元素进行比较,以找到内部列表中的确切位置以保持所有内容的排序。但是,当您仅使用角色进行比较时,在前三个元素之后,您从 CompareTo 方法开始 return 0。
SortedSet 不允许重复项,如果您 return 0 它会将此结果视为两个元素之间相等的标志,并且不会将新元素添加到其内部列表中。
顺便说一下,我认为您正在使用 SortedSet class。我在 class 库中找不到 ObservableSortedSet。
我有一个class这样的
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);
}
}
我想用这个 class 创建一个 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 class 时,它会立即与 class 中已有的其他元素进行比较,以找到内部列表中的确切位置以保持所有内容的排序。但是,当您仅使用角色进行比较时,在前三个元素之后,您从 CompareTo 方法开始 return 0。
SortedSet 不允许重复项,如果您 return 0 它会将此结果视为两个元素之间相等的标志,并且不会将新元素添加到其内部列表中。
顺便说一下,我认为您正在使用 SortedSet class。我在 class 库中找不到 ObservableSortedSet。