【问题标题】:proper way of implementing CompareTo method实现 CompareTo 方法的正确方法
【发布时间】:2013-12-04 10:43:10
【问题描述】:

我正在尝试了解 CompareTo 方法的正确实现和用法。

假设我有 Book 对象,我想在代码中的某处将新创建的 book 对象与数据库中的一个对象进行比较。

Book newBook = new Book();
Book dbBook = repository.GetBook(1);

所以基本上我是在尝试用多个参数比较两个对象

  • 标题
  • 版本
  • 语言

大致如下,那么您将如何实现具有这 3 个要求的此方法?

public int CompareTo(object obj)
{
    if(obj is Book)
    {
      Book b = (book)obj;
      var b = Name.ToUpper().CompareTo(b.Name.ToUpper());
    }
    else
    { throw new Exception("Not a book instance"); }

}

【问题讨论】:

  • CompareTo 旨在为该类型的对象提供排序,这意味着书籍 A 可能比书籍 B“更小”。您如何定义书籍的“更小”?
  • @Jon,这并不意味着“更小”,而是意味着“在订购时出现”。所以 OP 是说,为了对书籍进行排序,必须首先按标题排序,然后按版本排序,最后按语言排序。
  • @RoyDictus:这正是引号中“更小”的意思;该术语在广义上使用,即pretty common practice。此外,IMO 问题没有明确指定您描述的排序关系,而不是假设我问过。
  • 您似乎希望按该顺序比较{按标题、按版本、按语言},这是 OP 列出字段的顺序。

标签: c# .net comparison


【解决方案1】:

首先,最好使用泛型,将您的 Book 类定义为:

public class Book : IComparable<Book>

然后实现CompareTo方法:

public int CompareTo(Book book)
{
    int result = Title.CompareTo(book.Title);
    if (result == 0)
    {
       result = Edition.CompareTo(book.Edition);
       if (result == 0)
       {
            result = Language.CompareTo(book.Language);
       }
    }

    return result;
}

这当然假设属性TitleEditionLanguage 是实现IComparable 的类型(例如string)。

【讨论】:

  • OP 似乎想忽略大小写(注意他对ToUpper() 的使用)所以比较可能会更好:int result = string.Compare(this.Title, book.Title, ignoreCase:true);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
  • 2010-09-21
  • 1970-01-01
  • 2017-10-17
相关资源
最近更新 更多