2013-12-04 4 views
0

Я пытаюсь понять правильную реализацию и использование метода CompareTo.правильный способ реализации метода CompareTo

Предположим, что у меня есть объект Book и где-то в коде. Я хочу сравнить только что созданный объект книги с одним из базы данных.

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

поэтому в основном я пытаюсь сравнить два объекта с несколькими parametars

  • Название
  • издание
  • Язык

примерно я следующий ниже, так как бы вы реализуете этот метод, имея эти 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"); } 

} 
+0

'CompareTo' предназначен для заказа объектов типа, что означает, что книга A может быть« меньше », чем книга B. Как вы определяете« меньше »для книг? – Jon

+0

@Jon, это не означает «меньше», это означает «приходит раньше, когда заказывается». Поэтому OP говорит, что для сортировки книг нужно сначала отсортировать по названию, затем по версии и, наконец, по языку. –

+0

@RoyDictus: Это именно то, что означает «меньше» в кавычках; этот термин используется в обобщенном смысле, который является [довольно распространенной практикой] (http://blogs.msdn.com/b/ericlippert/archive/2007/10/16/covariance-and-contravariance-in-c-part -one.aspx). Кроме того, ИМО в вопросе явно не указывает отношения упорядочения, которые вы описываете, вместо того, чтобы предполагать, что я спросил. – Jon

ответ

2

Прежде всего, это лучше использовать дженерики, чтобы определить свой класс книги, как:

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; 
} 

Это, конечно, предполагает, что свойства Title, Edition и Language относятся к типам, которые реализуют IComparable (например, string).

+0

OP, похоже, хочет игнорировать случай (обратите внимание на его использование 'ToUpper()'), поэтому, возможно, сравнение будет лучше: 'int result = string.Compare (this.Title, book.Title, ignoreCase: true);' –

Смежные вопросы