如何向CompareTo方法添加另一个参数?

时间:2018-09-09 00:17:44

标签: c#

我如何在CompareTo方法中添加另一个参数,以便实现一个switch语句以允许程序选择将比较的CompareTo方法?

当前我正在做的事情

public int CompareTo(Employee other)
        {
            return name.CompareTo(other.name);
        }

我想做什么:

public int CompareTo(Employee other, string choice)
        {
            switch(choice)
            {
                 case "name":
                     return name.CompareTo(other.name);
                 case "number"
                     return number.CompareTo(other.number);
            }
            return name.CompareTo(other.name);
        }

1 个答案:

答案 0 :(得分:4)

我假设您正在询问如何扩展无法修改的现有类的功能(否则您可以直接编辑该类本身),如果是这种情况,我建议将扩展方法设置为例如:

public static class EmployeeExtensions {
    public static int CompareTo(this Employee baseEmployee, Employee other, string choice){
         ... code ....
         return 0;
    }
}

这将允许您扩展比较功能,并在需要时从任何地方调用它。您需要将扩展​​方法放在其自己的静态类中。

您可以通过以下方式调用它:

Employee a = new Employee(...);
Employee b = new Employee(...);
a.CompareTo(b, "args");

假设扩展类已导入您要使用的位置。这通常是C#允许扩展您无法访问的类的功能的方式。虽然如果您确实有权访问该类,我建议您编辑该类本身并创建一个新方法(您可以重写),但是如果它们提供了独特的功能,则您需要编写两个方法,在这种情况下,代码是重复的可以)。

如果您实际上是在尝试更改默认的相等成员,则此方法将不适用;如果是这种情况,您将无法添加自己的参数,并且该参数仍可与现有基础结构(例如列表排序)一起使用,所以我例如,“如果您想向等号添加一个参数,则建议重新评估您的问题。

如果您尝试更改对象比较的方式(实现IComparable的对象),则制作自己的IComparer并使用该方式进行比较,请勿尝试更改CompareTo在类上的完成方式,因为比较的默认行为(按原样使用参数)很有用。我也不是说不要实现IComparable(而不是创建IComparer),如果它有意义并且您可以访问该类,然后使用IComparable,但这将不允许您更改继承的compare方法的参数。