1. ホーム
  2. c#

[解決済み] LINQの昇順・降順 - パラメータで順序を変更できるか?

2023-06-24 21:11:02

質問

私は、パラメータ "bool sortAscending" を与えられたメソッドを持っています。今、私はこのパラメータに応じてソートされたリストを作成するためにLINQを使用したいと思います。私はこれを得た。

var ascendingQuery = from data in dataList
                      orderby data.Property ascending
                      select data;

var descendingQuery = from data in dataList
                      orderby data.Property descending
                      select data;

ご覧のとおり、両方のクエリは "ascending" と "descending" のみが異なっています。両方のクエリをマージしたいのですが、方法がわかりません。誰か答えを持っていますか?

どのように解決するのですか?

IEnumerableやIQueryableに独自の拡張メソッドを簡単に作成することができます。

public static IOrderedEnumerable<TSource> OrderByWithDirection<TSource,TKey>
    (this IEnumerable<TSource> source,
     Func<TSource, TKey> keySelector,
     bool descending)
{
    return descending ? source.OrderByDescending(keySelector)
                      : source.OrderBy(keySelector);
}

public static IOrderedQueryable<TSource> OrderByWithDirection<TSource,TKey>
    (this IQueryable<TSource> source,
     Expression<Func<TSource, TKey>> keySelector,
     bool descending)
{
    return descending ? source.OrderByDescending(keySelector)
                      : source.OrderBy(keySelector);
}

しかし、率直に言って、この場合、クエリ式が役に立つとは思えません。クエリ式は複雑なものには最適ですが、1つの操作しか行わないのであれば、その1つの操作だけを記述する方がシンプルです。

var query = dataList.OrderByWithDirection(x => x.Property, direction);