我用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;
}
}在主程序中,我创建了一个客户列表,并添加了三个客户。
List<Customer> ListCust = new List<Customer>();
ListCust.Add(Cust1);
ListCust.Add(Cust2);
ListCust.Add(Cust3);然后我对名单进行排序。
ListCust.Sort();我的问题是,这种列表提取客户类的"CompareTo“部分的方法是怎样的。最初,当我试图在没有iComparable接口的情况下对其进行排序时,它给了我无效的操作错误。
下面的问题是,为什么我不能在没有iComparable接口的customer类中创建一个“iComparable”方法并使其工作呢?
发布于 2016-03-19 07:43:02
.NET不能对您的Customer对象进行“公正”排序的原因是,它无法猜测您希望以何种方式对它们进行排序:按工资、按名、按姓、按第一次订货时排序等等。
但是,您可以在不以三种不同的方式实现IComparable的情况下使其工作:
发布于 2016-03-19 07:44:44
Sort方法检查类型参数是否实现了IComparable。如果是这样,则该方法将列表中的每个项转换为IComparable。类似这样的事情:(也许他们并不是这样做的,但你明白了。)
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");
}
}因此,如果不实现IComparable,则item is IComparable的计算结果为false,这就是抛出InvalidOperationException的原因。
所以最终的原因是..。
源代码不检查是否有
CompareTo方法。它只检查是否实现了接口。
发布于 2016-03-19 07:42:39
检查关于MSDN的Sort方法的文档,它说
当比较器为空时抛出InvalidOperationException,并且默认比较器Comparer.Default找不到类型T的IComparable泛型接口或IComparable接口的实现。
它是这样设计的。
https://stackoverflow.com/questions/36099103
复制相似问题