首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iComparable接口工作

iComparable接口工作
EN

Stack Overflow用户
提问于 2016-03-19 07:28:58
回答 3查看 133关注 0票数 1

我用iComparable接口创建了一个Customer类。

代码语言:javascript
运行
复制
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;
     }

}

在主程序中,我创建了一个客户列表,并添加了三个客户。

代码语言:javascript
运行
复制
List<Customer> ListCust = new List<Customer>(); 
ListCust.Add(Cust1);
ListCust.Add(Cust2);
ListCust.Add(Cust3);

然后我对名单进行排序。

代码语言:javascript
运行
复制
ListCust.Sort();

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-03-19 07:43:02

.NET不能对您的Customer对象进行“公正”排序的原因是,它无法猜测您希望以何种方式对它们进行排序:按工资、按名、按姓、按第一次订货时排序等等。

但是,您可以在不以三种不同的方式实现IComparable的情况下使其工作:

  • implementation --这允许您将比较逻辑移动到单独的类,并根据情况应用不同的比较逻辑。
  • Comparison 委托--与上面相同,但现在不需要单独的类;这允许您在lambda中提供比较逻辑。
  • 使用LINQ的 OrderBy 而不是--类似于上面的内容,但是提供了额外的功能(过滤、投影、分组等)。
票数 2
EN

Stack Overflow用户

发布于 2016-03-19 07:44:44

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

代码语言:javascript
运行
复制
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方法。它只检查是否实现了接口。

票数 2
EN

Stack Overflow用户

发布于 2016-03-19 07:42:39

检查关于MSDNSort方法的文档,它说

当比较器为空时抛出InvalidOperationException,并且默认比较器Comparer.Default找不到类型T的IComparable泛型接口或IComparable接口的实现。

它是这样设计的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36099103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档