C# i可比较接口工作

C# i可比较接口工作,c#,icomparable,C#,Icomparable,我创建了一个具有iComparable接口的Customer类 public class Customer: IComparable<Customer> { public int ID {set; get;} public string Name {set; get;} public int Salary {set; get;} public int CompareTo(Customer obj) { if (this.Salar

我创建了一个具有iComparable接口的Customer类

public class Customer: IComparable<Customer>
{
    public int ID {set; get;}
    public string Name {set; get;}
    public int Salary {set; get;}

    public int CompareTo(Customer obj)
    {
      if (this.Salary > obj.Salary)
          return 1;
        else if
            (this.Salary < obj.Salary)
            return -1;
        else
            return 0;
     }

}
我的问题是,这种列表方法如何提取Customer类的“CompareTo”部分。最初,当我试图在没有iComparable接口的情况下对其进行排序时,它给了我无效的操作错误


下面的问题是为什么我不能在没有iComparable接口的customer类中创建一个“CompareTo”方法并使其工作

检查
Sort
方法的文档

当comparer为null时,会引发InvalidOperationException,默认comparer comparer.default找不到类型T的IComparable泛型接口或IComparable接口的实现


它是这样设计的。

检查
排序方法的文档,它说

当comparer为null时,会引发InvalidOperationException,默认comparer comparer.default找不到类型T的IComparable泛型接口或IComparable接口的实现

它是这样设计的。

之所以.NET不能“仅仅”对您的
客户
对象进行排序,是因为它无法猜测您希望以何种方式对它们进行排序:按工资、按姓名、按姓氏、按他们下第一次订单的时间等等

但是,您可以通过三种不同的方式使其工作,而无需实现
IComparable

  • 实现-这允许您将比较逻辑移动到单独的类,并根据情况应用不同的比较逻辑
  • 委托-同上,但现在不需要单独的类;这允许您在lambda中提供比较逻辑
  • 改用LINQ-与上述类似,但提供了附加功能(过滤、投影、分组等)
    • NET无法“仅仅”对您的
      客户对象进行排序的原因是,它无法猜测您希望以何种方式对其进行排序:按工资、按姓名、按姓氏、按他们下第一次订单的时间等

      但是,您可以通过三种不同的方式使其工作,而无需实现
      IComparable

      • 实现-这允许您将比较逻辑移动到单独的类,并根据情况应用不同的比较逻辑
      • 委托-同上,但现在不需要单独的类;这允许您在lambda中提供比较逻辑
      • 改用LINQ-与上述类似,但提供了附加功能(过滤、投影、分组等)

      Sort
      方法检查类型参数是否实现了
      IComparable
      。如果是,则该方法将列表中的每个项目强制转换为
      IComparable
      。类似这样的事情:(可能不是他们实际上是怎么做的,但你明白了。)

      因此,如果您没有实现
      IComparable
      项是IComparable
      的计算结果为false,因此会抛出
      无效操作异常

      因此,最终的原因是

      源代码不会检查您是否有
      CompareTo
      方法。它只是检查您是否实现了接口


      Sort
      方法检查类型参数是否实现了
      IComparable
      。如果是,则该方法将列表中的每个项目强制转换为
      IComparable
      。类似这样的事情:(可能不是他们实际上是怎么做的,但你明白了。)

      因此,如果您没有实现
      IComparable
      项是IComparable
      的计算结果为false,因此会抛出
      无效操作异常

      因此,最终的原因是

      源代码不会检查您是否有
      CompareTo
      方法。它只是检查您是否实现了接口


      非常感谢。对于我的第一个问题,我说列表集合中的sort方法查找iComparable的CompareTo方法的实现是否正确?@user3186277最终,是的,尽管它没有直接这样做。它尝试通过
      comparer.default
      获取默认比较器,该比较器首先尝试
      IComparable
      ,然后尝试非泛型
      IComparable
      。如果两次尝试都失败,sort将抛出一个异常。谢谢。对于我的第一个问题,我说列表集合中的sort方法查找iComparable的CompareTo方法的实现是否正确?@user3186277最终,是的,尽管它没有直接这样做。它尝试通过
      comparer.default
      获取默认比较器,该比较器首先尝试
      IComparable
      ,然后尝试非泛型
      IComparable
      。如果两次尝试都失败,sort将抛出异常。
      List<Customer> ListCust = new List<Customer>(); 
      ListCust.Add(Cust1);
      ListCust.Add(Cust2);
      ListCust.Add(Cust3);
      
      ListCust.Sort();
      
      foreach (T item in this) {
          if (item is IComparable) {
              var castedItem = (IComparable)item;
              // do other things with castedItem
          } else {
              throw new InvalidOperationException("Sorting is not supported");
          }
      }