web-dev-qa-db-ja.com

2つ以上のプロパティによるIQueryable順序

現在、次のようにIQueryable OrderByメソッドを使用してカスタムオブジェクトのリストを注文しています。

mylist.AsQueryable().OrderBy("PropertyName");

現在、複数のプロパティでソートすることを検討しています。それを行う方法はありますか?

ありがとう、Yannis

27
Yannis
OrderBy(i => i.PropertyName).ThenBy(i => i.AnotherProperty)

OrderByおよびThenByでは、オブジェクトからソートするためのキーを選択するkeySelector関数を提供する必要があります。したがって、実行時にのみプロパティ名がわかっている場合は、次のようなReflectionでそのような関数を作成できます。

var propertyInfo = i.GetType().GetProperty("PropertyName"); 
var sortedList = myList.OrderBy(i => propertyInfo.GetValue(i, null)) 

しかし、それは遅くなり、プロパティに直接アクセスします。また、Linq.Expressionsを使用してそのような関数をオンザフライで「コンパイル」でき、リフレクションよりも高速に動作しますが、簡単ではありません。または、WPFでCollectionViewSourceとそれらの並べ替え機能を使用できます。

また、OrderBy()は列挙可能なソート済みを返し、既存のリストをインプレースでソートしないことを忘れないでください。あなたの例では、ソートされたリストを変数に保存しませんでした。

52
Nikolay

.ThenBy

var result = mylist
    .AsQueryable()
    .OrderBy(x => x.PropertyName)
    .ThenBy(x => x.SomeOtherProperty);
13
Darin Dimitrov

おそらく、ThenBy拡張メソッドを使用して、複数のフィールドで並べ替えることができます

 return myList.AsQueryable().OrderBy(m=>m.Property1).ThenBy(m => m.Property2);

動的なLinqが必要な場合は、 LinqKit を参照してください。最近、Microsoftの動的Linqライブラリを here から実装し、文字列を使用して2つのフィールドで並べ替えることができました。

すごいもの!これが.NET 5になるかどうかわからない。

6
Chris Gessler

他の人が示唆しているように、「ThenBy」を使用できます。文字列を使用する前に別の値に変換したい場合、これも可能です...

    var sortedSystemTestResultsList = systemTestResultsList.OrderBy(s =>
    {
        DateTime dt;
        if (!DateTime.TryParse(s.testPointCompletedDate, out dt)) return DateTime.MaxValue;
        return dt;
    }).ThenBy(s =>
    {
        Int32 tpID;
        if (!Int32.TryParse(s.testRunResultID, out tpID)) return Int32.MaxValue;
        return tpID;
    });
0
ZenoArrow