###「いろは」の「ろ」
Models .OrderBy(cell => cell.Number) .ThenBy(cell => cell.Size);
でNumberとSizeがnullの場合、nullを下にするようにしました。
Models .OrderByDescending(cell => !string.IsNullOrEmpty(cell.Number)) .ThenBy(cell => cell.Number) .ThenByDescending(cell => !string.IsNullOrEmpty(cell.Size)) .ThenBy(cell => cell.Size);
###「いろは」の「は」
これソート項目が増えると大変なので。
https://www.gakusmemo.com/?p=197
C#
1public static IEnumerable<T> ConcatenationSort<T>(this IEnumerable<T> query, List<string> sortitems) 2{ 3 int index = 0; 4 IOrderedEnumerable<T> orderedQuery = null; 5 foreach (var sortitem in sortitems) 6 { 7 Func<T, object> expression = item => item.GetType() 8 .GetProperty(sortitem) 9 .GetValue(item, null); 10 orderedQuery = (index == 0) ? query.OrderBy(expression) : orderedQuery.ThenBy(expression); 11 index++; 12 } 13 query = orderedQuery; 14 return query; 15}
これだと、
Models .ConcatenationSort(new List<string> { "Number", "Color", "Size" });
でいけます。
ただ、
C#
1orderedQuery = (index == 0) ? query.OrderBy(expression) : orderedQuery.ThenBy(expression);
のとおり、null対応していません。
null対応するには、
C#
1orderedQuery = (index == 0) ? query.OrderByDescending(expression2).OrderBy(expression) : orderedQuery.ThenByDescending(expression2).ThenBy(expression);
とすると思います。
このexpression2をどう構築すればいいですか?
C#
1 Func<T, object> expression2 = item => !string.IsNullOrEmpty(item.GetType() 2 .GetProperty(sortitem) 3 .GetValue(item, null) 4 .ToString());
と作ってみたところ、nullになって動かずにいます。
回答2件
あなたの回答
tips
プレビュー