Подтвердить что ты не робот

Пользовательский OrderBy в списке <T>

Я пытаюсь найти лучший способ для сортировки списка. Допустим, что T - объект с свойством date (DateTime?) И свойством status (string).

У меня есть 3 случая...

"Срочно": я хочу, чтобы они находились в верхней части списка, нет конкретного порядка
date = null
status = "Срочно"

"Нормальный": я хочу, чтобы они были заказаны по дате после срочных дел
date = любая действительная дата/время
status = "Вкл. время"

"Позже": я хочу, чтобы они были внизу списка, никакого конкретного заказа
date = null
status = "Later"

Любые мысли? Должен ли я использовать объект IQuerable вместо List? Я всегда могу .ToList() объект позже отправить на мой просмотр.

4b9b3361

Ответ 1

Не должно быть слишком сложно, просто сделайте T реализовать IComparable, используя ваши правила сравнения, и вы должны быть установлены.

Ответ 2

query = query.OrderBy(x =>
  x.Status == "Urgent" ? 1:
  x.Status == "Normal" ? 2:
  3)
  .ThenBy(x => 
  x.Status == "Urgent" ? null:
  x.Status == "Normal" ? x.Date:
  null);

Случайное воспроизведение: относится ли заказ к запросу или к классу?

Ответ 3

Вам нужно будет предоставить реализацию IComparer, а затем вы можете передать ее с использованием следующей перегрузки:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector,
    IComparer<TKey> comparer
)

Смотрите: http://msdn.microsoft.com/en-us/library/bb549422.aspx

Ответ 4

Самый простой способ - использовать linq:

itemsList = itemsList.OrderByDescending(ob => ob.status ).ThenBy(ob => ob.date).ToList();

Ответ 5

Вы можете просто использовать метод расширения:

Что-то вроде этого...

public static IOrderedEmumerable<MyType> OrderForDisplay (this IEnumerable<MyType> input)
{
  return
    input
    .OrderBy(item => item.Status)
    .ThenByDescending(item => item.Status == 1 ? DateTime.MaxDate : item.date);
}