Решение для строковых значений действительно странное:
.OrderBy(f => f.SomeString == null).ThenBy(f => f.SomeString)
Единственная причина, которая работает, заключается в том, что первое выражение, OrderBy()
, sort bool
values: true
/ false
.false
результат идет первым, затем следует true
результат (обнуляемый) и ThenBy()
сортировка ненулевых значений в алфавитном порядке.
Итак, я предпочитаю делать что-то более читабельное, например, это:
.OrderBy(f => f.SomeString ?? "z")
Если SomeString
равно нулю, оно будет заменено на "z"
, а затем отсортировано по алфавиту.
ПРИМЕЧАНИЕ. Это не окончательное решение, поскольку "z"
идет первым, чем z-значения, такие как zebra
.
ОБНОВЛЕНИЕ 9.09.2016 - About @Комментарий Jornhd, это действительно хорошее решение, но оно все еще немного сложное, поэтому я рекомендую обернуть его в класс Extension, такой как:
public static class MyExtensions
{
public static IOrderedEnumerable<T> NullableOrderBy<T>(this IEnumerable<T> list, Func<T, string> keySelector)
{
return list.OrderBy(v => keySelector(v) != null ? 0 : 1).ThenBy(keySelector);
}
}
И просто использовать его как:
var sortedList = list.NullableOrderBy(f => f.SomeString);