C# 如何使用IComparable比较复杂对象

C# 如何使用IComparable比较复杂对象,c#,C#,假设我有一个名为firstName和lastName的类。我想根据firstName比较对象,所以我写了一段代码,如下所示: public class Customer : IComparable<Customer> { public string FName { get; set; } public string LName { get; set; } public int CompareTo(Customer other) { re

假设我有一个名为firstName和lastName的类。我想根据firstName比较对象,所以我写了一段代码,如下所示:

public class Customer : IComparable<Customer>
{
    public string FName { get; set; }
    public string LName { get; set; }
    public int CompareTo(Customer other)
    {
        return this.FName.CompareTo(other.FName); .
    }
}
它工作得很好,但假设我还需要根据姓氏进行比较。在这个场景中我能做什么

在该场景中,您可以使用以下选项之一。以下是三种不同方式的比较

public class Program
{
    public static void Main()
    {
        var customers = new List<Customer> 
        {
            new Customer("a", "c", "b"),
            new Customer("b", "a", "c"),
            new Customer("c", "b", "a"),
        };

        // A: uses Customer.CompareTo(...)
        customers.Sort();

        // B: uses a lambda
        customers.Sort((x, y) => x.Last.CompareTo(y.Last));

        // C: uses MiddleNameComparer.Compare(...)
        customers.Sort(new MiddleNameComparer());
    }
}
下面是实现
IComparer
MiddleNameComparer

public class MiddleNameComparer : IComparer<Customer>
{
    public int Compare(Customer x, Customer y)
    {
        return x.Middle.CompareTo(y.Middle);
    }
}
公共类MiddleNameComparer:IComparer
{
公共整数比较(客户x、客户y)
{
返回x.Middle.CompareTo(y.Middle);
}
}

为什么不采用两种方法?一个检查名字,一个检查姓氏?或者你想要一个对照名字或姓氏的条件吗?它只是一个符号表示。我只是在努力学习。我的意思是,我不应该用CompareTo。因为它提供了严重的限制。所以,每当我在复杂类型中有一种比较类型时,只有I CompareTo是有效的和有用的。如果我有一种情况,需要对多个东西进行比较,那么比较就没有用了?请指导您似乎意识到的MEA,
IComparable
IComparable(Of T)
只有在有一种方法比较值/对象或至少有一种逻辑默认方法时才有用。如果您希望能够以多种方式比较您的类型,那么一个选项是定义一个或多个实现
IComparer
IComparer(Of T)
的copanion类。在这样的类中,您可以实现多个比较方法,每个类一个,或者由构造函数参数确定多个。否则,只需使用特别的
比较(T)
委托等。因此,我可以创建自己的类并实现
Icomparer
,或者更好地使用lamda:)@Unbreakable Yes。如果我从一个兰姆达开始。后来,如果我发现自己到处复制/粘贴lambda,我会将其封装到自己的类中,该类实现了一个
IComparer
。本例使用lambda创建一个
比较(T)
委托。该代理与
IComparable(Of T.Compare)方法和
icomparaer(Of T.Compare)方法具有相同的签名。它们是做同样事情的三种方式,一种内置在被比较的类型中,一种在helper类中实现,另一种是特别的。将其构建到类型中最好是对该类型进行多次比较,如果定期比较该类型,则helper类最好,但没有单一明显的比较方法,临时比较更适合一次性比较。我明白了。因此,它最终指向相同的CompareTo方法,就像显式委托一样。不,不是相同的
CompareTo
方法。在这种情况下,特殊方法使用
String
类的
CompareTo
方法。当你开始比较时,比较几乎总是在复杂类型的部分上进行,这些复杂类型是
字符串
、数字或类似的简单类型,因此你几乎可以在复杂比较中使用这些类型的
比较方法。
public class Program
{
    public static void Main()
    {
        var customers = new List<Customer> 
        {
            new Customer("a", "c", "b"),
            new Customer("b", "a", "c"),
            new Customer("c", "b", "a"),
        };

        // A: uses Customer.CompareTo(...)
        customers.Sort();

        // B: uses a lambda
        customers.Sort((x, y) => x.Last.CompareTo(y.Last));

        // C: uses MiddleNameComparer.Compare(...)
        customers.Sort(new MiddleNameComparer());
    }
}
public class Customer : IComparable<Customer>
{
    public string First { get; set; }
    public string Middle { get; set; }
    public string Last { get; set; }

    public Customer(string first, string middle, string last)
    {
        First = first;
        Middle = middle;
        Last = last;
    }

    public int CompareTo(Customer p)
    {
        return this.First.CompareTo(p.First);
    }
}
public class MiddleNameComparer : IComparer<Customer>
{
    public int Compare(Customer x, Customer y)
    {
        return x.Middle.CompareTo(y.Middle);
    }
}