Solusi untuk nilai string sangat aneh:
.OrderBy(f => f.SomeString == null).ThenBy(f => f.SomeString)
Satu-satunya alasan yang berhasil adalah karena ekspresi pertama, OrderBy()
,, mengurutkan bool
nilai: true
/ false
. false
hasilnya pergi dulu diikuti oleh true
hasilnya (nullables) dan ThenBy()
urutkan nilai bukan null menurut abjad.
e.g.: [null, "coconut", null, "apple", "strawberry"]
First sort: ["coconut", "apple", "strawberry", null, null]
Second sort: ["apple", "coconut", "strawberry", null, null]
Jadi, saya lebih suka melakukan sesuatu yang lebih mudah dibaca seperti ini:
.OrderBy(f => f.SomeString ?? "z")
Jika SomeString
nol, itu akan diganti dengan "z"
dan kemudian mengurutkan semuanya menurut abjad.
CATATAN: Ini bukan solusi pamungkas karena "z"
lebih dulu daripada nilai-z sepertizebra
.
UPDATE 9/6/2016 - Tentang komentar @jornhd, ini benar-benar solusi yang bagus, tetapi masih sedikit rumit, jadi saya akan merekomendasikan untuk membungkusnya dalam kelas Ekstensi, seperti ini:
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);
}
}
Dan gunakan sederhana seperti:
var sortedList = list.NullableOrderBy(f => f.SomeString);
orderby p.LowestPrice ?? Int.MaxValue;
adalah cara yang sederhana.