Здравствуйте. не знаю в какой форум.
если реализация этого метода занимает более 20-и if'ов — это нормально?
просто условие сортировки такое... это сильно повлияет на производительность при объеме до 500 элементов?
что еще можно применить кроме реализации IComparble<T> для такого длинного условия ?
спасибо.
Здравствуйте, corpse56, Вы писали: C>если реализация этого метода занимает более 20-и if'ов — это нормально?
Вы не стесняйтесь, приведите эту реализацию, а тут уже подскажут нормально или нет
C>просто условие сортировки такое... это сильно повлияет на производительность при объеме до 500 элементов?
Все экстрасенсы на ТНТ...
C>что еще можно применить кроме реализации IComparble<T> для такого длинного условия ?
Чуть-чуть быстрее сортировки с использованием IComparable<T> будет использование делегата Comparator, если метод сортировки позволяет, конечно (насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса, но при 500 элементах это всё такие мелочи, что Вы никогда не заметите разницы).
Здравствуйте, Пельмешко, Вы писали:
C>>что еще можно применить кроме реализации IComparble<T> для такого длинного условия ? П>Чуть-чуть быстрее сортировки с использованием IComparable<T> будет использование делегата Comparator, если метод сортировки позволяет, конечно (насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса, но при 500 элементах это всё такие мелочи, что Вы никогда не заметите разницы).
По скорости вызова делегат как раз медленнее вызова через интерфейс.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, Пельмешко, Вы писали: П>>насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса
AVK>Это откуда такие данные?
Чего-то навскидку решил что двойная косвенность при вызове через интерфейс победит оверхед делегата
Как показала практика — безосновательно...
П>Вы не стесняйтесь, приведите эту реализацию, а тут уже подскажут нормально или нет
public int CompareTo(Book other) // первичное условие - язык. внутри языка сортируется по автору. если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
{
if (other.language_ > this.language_)
return 1;
if (other.language_ < this.language_)
return -1;
if (other.language_ == this.language_)
{
if ((other.author_ != "") && (this.author_ != ""))
{
if (other.authorSrt_ > this.authorSrt_)
return 1;
if (other.authorSrt_ < this.authorSrt_)
return -1;
if ((other.authorSrt_ == this.authorSrt_) || ((other.author_ == "") && (this.author_ == "")) )
{
if (other.titleSrt_ > this.titleSrt_)
return 1;
if (other.titleSrt_ < this.titleSrt_)
return -1;
if (other.titleSrt_ == this.titleSrt_)
return 0;
}
}
else
if ((other.author_ == "") && (this.author_ != ""))
{
if (other.titleSrt_ > this.authorSrt_)
return 1;
if (other.titleSrt_ < this.authorSrt_)
return -1;
if (other.titleSrt_ == this.authorSrt_)
return 0;
}
else
if ((other.author_ != "") && (this.author_ == ""))
{
if (other.authorSrt_ > this.titleSrt_)
return 1;
if (other.authorSrt_ < this.titleSrt_)
return -1;
if (other.authorSrt_ == this.titleSrt_)
return 0;
}
else
{
return 0;
}
}
}
C>>что еще можно применить кроме реализации IComparble<T> для такого длинного условия ? П>Чуть-чуть быстрее сортировки с использованием IComparable<T> будет использование делегата Comparator, если метод сортировки позволяет, конечно (насколько помню, вызов делегата в простейшем случае чуть быстрее вызова члена интерфейса, но при 500 элементах это всё такие мелочи, что Вы никогда не заметите разницы).
Понятно. спасибо.
а при каких объемах такое условие начнет сказываться? это мне просто интересно.
это не настоящий код.
1) операторы >, < для строк по умолчанию не определены. у вас они определяются?
2) возвращающееся значение не всегда определено
но все же мой вариант выглядел примерно так:
public int CompareTo(Book other)
//первичное условие - язык.
//внутри языка сортируется по автору.
//если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
{
var res = other.language_.CompareTo(language_);
if (res != 0)
return res;
res = other.authorSrt_.CompareTo(authorSrt_);
if (res != 0)
return res;
return other.titleSrt_.CompareTo(titleSrt_);
}
Здравствуйте, corpse56, Вы писали: C>Понятно. спасибо.
C>а при каких объемах такое условие начнет сказываться? это мне просто интересно.
Не не не, прочитайте топик, я ошибался
Приемущество IComparable<T> над делегатами начнёт проявляться на миллионах итераций
А упростить реализацию Вам прекрасно подсказали как, используйте CompareTo() сравниваемых элементов.
Если у Вас там всё же строки, то реализация совсем не сложная, незачем в таких местах при 500 элементах думать о производительности.
Здравствуйте, Ovl, Вы писали:
Ovl>это не настоящий код. Ovl>1) операторы >, < для строк по умолчанию не определены. у вас они определяются?
не знал. но есть метод Compare. его скорее всего и буду использовать
Ovl>2) возвращающееся значение не всегда определено
почему??
Ovl>но все же мой вариант выглядел примерно так:
Ovl>
Ovl>public int CompareTo(Book other)
Ovl> //первичное условие - язык.
Ovl> //внутри языка сортируется по автору.
Ovl> //если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
Ovl>{
Ovl> var res = other.language_.CompareTo(language_);
Ovl> if (res != 0)
Ovl> return res;
Ovl> res = other.authorSrt_.CompareTo(authorSrt_);
Ovl> if (res != 0)
Ovl> return res;
Ovl> return other.titleSrt_.CompareTo(titleSrt_);
Ovl>}
Ovl>
ну суть я понял, только ваш вариант под мои условия не подходит. если отсутствует автор в other, то сравниватся заглавие other с автором this.
Здравствуйте, Пельмешко, Вы писали:
П>Здравствуйте, corpse56, Вы писали: C>>Понятно. спасибо.
C>>а при каких объемах такое условие начнет сказываться? это мне просто интересно.
П>Не не не, прочитайте топик, я ошибался П>Приемущество IComparable<T> над делегатами начнёт проявляться на миллионах итераций
П>А упростить реализацию Вам прекрасно подсказали как, используйте CompareTo() сравниваемых элементов. П>Если у Вас там всё же строки, то реализация совсем не сложная, незачем в таких местах при 500 элементах думать о производительности.
Ovl>какое значение генерировать для возврата? компилятор не обманешь
не могут все три быть ложью. только три варианта: больше, меньше либо равно. вот что у меня получилось:
public int CompareTo(Book other) // первичное условие - язык. внутри языка сортируется по автору. если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
{
int res = String.Compare(other.language_, this.language_);
if (res != 0)
return res;
if ((other.author_ != "") && (this.author_ != "")) //в обоих книгах есть автор
{
res = String.Compare(other.authorSrt_, this.authorSrt_);
if (res != 0)
return res;
}
if ((other.author_ == "") && (this.author_ != "")) //во входном объекте книги автора нет, в текущем есть - сравниваем по заглавию входного объекта книги и автору текущего
{
res = String.Compare(other.titleSrt_, this.authorSrt_);
if (res != 0)
return res;
}
if ((other.author_ != "") && (this.author_ == "")) //во входном объекте книги автор есть, в текущем нет - сравниваем по автору входного объекта книги и заглавию текущего
{
res = String.Compare(other.authorSrt_, this.titleSrt_);
if (res != 0)
return res;
}
//if ((other.author_ == "") && (this.author_ == "")) // авторов нет - сортируем по заглавию
//{return res = String.Compare(other.titleSrt_, this.titleSrt_);
//if (res != 0)
// return res;
//}
}
Ovl>зы. кстати, непонятно зачем там оказалось ((other.author_ == "") && (this.author_ == ""))
это и правда лишнее
Здравствуйте, corpse56, Вы писали:
C>Здравствуйте, Ovl, Вы писали:
Ovl>>>>какое значение генерировать для возврата? компилятор не обманешь C>>>не могут все три быть ложью.
Ovl>>а что мешает?
C>3 результата: больше, меньше или равно. и для каждого существует условие. или я что-то упускаю?
результат этих операций может зависеть от фазы луны или от рандома, например.
если бы было:
if (...) {
return -1;
}
else if (...) {
return 1;
}
else {
return 0;
}
то можно сказать — всегда сработает один из трех ретурнов. в вашем случае — нет, поскольку цепочка имеет дырку, когда все условия вернут false.
о чем спор-то? все равно ваш пример не построится.
Здравствуйте, corpse56, Вы писали: C>вот что у меня получилось:
C>
C> public int CompareTo(Book other) // первичное условие - язык. внутри языка сортируется по автору. если автора нет то объектом сортировки становиться заглавие. (вот такая вот фигня)
C> {
C> int res = String.Compare(other.language_, this.language_);
C> if (res != 0)
C> return res;
C> if ((other.author_ != "") && (this.author_ != "")) //в обоих книгах есть автор
C> {
C> res = String.Compare(other.authorSrt_, this.authorSrt_);
C> if (res != 0)
C> return res;
C> }
C> if ((other.author_ == "") && (this.author_ != "")) //во входном объекте книги автора нет, в текущем есть - сравниваем по заглавию входного объекта книги и автору текущего
C> {
C> res = String.Compare(other.titleSrt_, this.authorSrt_);
C> if (res != 0)
C> return res;
C> }
C> if ((other.author_ != "") && (this.author_ == "")) //во входном объекте книги автор есть, в текущем нет - сравниваем по автору входного объекта книги и заглавию текущего
C> {
C> res = String.Compare(other.authorSrt_, this.titleSrt_);
C> if (res != 0)
C> return res;
C> }
C> //if ((other.author_ == "") && (this.author_ == "")) // авторов нет - сортируем по заглавию
C> //{
C> return res = String.Compare(other.titleSrt_, this.titleSrt_);
C> //if (res != 0)
C> // return res;
C> //}
C> }
C>
Вот вариант исправленный и упрощенный:
public class Book
{
public string language_;
public string author_;
public string titleSrt_;
public string authorSrt_;
public int CompareTo(Book other)
{
int res = String.Compare(this.language_, other.language_); //fixed comparing orderif (res != 0) return res;
string a = this.author_ != "" ? this.authorSrt_ : this.titleSrt_;
string b = other.author_ != "" ? other.authorSrt_ : other.titleSrt_;
return String.Compare(a, b);
}
}