2016-07-29 3 views
0

У меня есть абстрактный класс с именем Time, затем два подкласса SingleYear и Period. У меня могло быть больше подклассов позже.C# Сначала заказывайте по типу класса, затем используйте CompareTo

Класс Time класс реализует IComparable, но функция CompareTo фактически реализована в каждом подклассе.

У меня есть запрос в LINQ, как это: myListOfObjects.OrderBy(o=>o.Time);

Это работает. Тем не менее, я хотел бы иметь возможность выбрать, должны ли объекты SingleYear или Period первыми (до фактического CompareTo). Моя реализация CompareTo верна, однако в некоторых случаях мне нужно показать первые периоды, затем один год (или наоборот).

Поскольку у меня может быть больше (скажем, 5-6) подклассов, как я могу указать, какие подклассы должны быть первыми, а затем CompareTo будет выполнять свою работу позже?

+1

Я голосую, чтобы закрыть этот вопрос не по теме, потому что у вас уже есть рабочее решение. Подумайте о том, как адаптировать вопрос для обзора кода, чтобы ваш рабочий код был рассмотрен. – Servy

+1

Возможный дубликат [Множественный "заказ от" в LINQ] (http://stackoverflow.com/questions/298725/multiple-order-by-in-linq) – konkked

+0

@Servy У него есть рабочий код, который делает что-то еще. Каждый, кто задает вопрос, имеет какой-то рабочий код, который делает что-то еще. –

ответ

0

В большинстве случаев смысл иметь классы и подклассы в том, что мы можем бросить их в качестве базового класса (или интерфейса) и больше не придется различать конкретные типы.

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

.OrderBy(o => o is SingleYear) 
    .ThenBy(o => o is Period) 
    .ThenBy(o => o is SomeOtherClass) 
    .ThenBy(o => o is Another) 
    .ThenBy(o => o is Whatever) 
    .ThenBy(o => o is Etc) 
    .ThenBy(o => o.Time); 

Это не конец света но мне это не понравится. Лучше, если мы не будем различать классы в нашем коде (проверяя, какой тип они есть.) Вместо этого классы дифференцируют себя путем реализации свойств и методов по-разному.

Выполняется ли порядок сортировки в зависимости от продолжительности периода? У вас могут быть классы, реализующие свойство, указывающее длину периода - возможно, это постоянное значение для SingleYear, но рассчитанное для Period.

Тогда можно либо реализовать IComparable на каждом классе или предоставить отдельную IComparer<T> реализацию, как

public class TimeComparer : IComparer<Time> 
{ 
    public int Compare(Time t1, Time t2) 
    { 
     var periodComparison = t1.Duration.CompareTo(t2.Duration); 
     return periodComparison != 0 ? periodComparison : t1.Time.CompareTo(t2.Time); 
    } 
} 
0

Я думаю, что это будет сделать это:

list.OrderBy(t => typeof(t).Name).ThenBy(o => o.Time) 
Смежные вопросы