C# i可比较接口工作
我创建了一个具有iComparable接口的Customer类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
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");
}
}