現在、次のようにIQueryable OrderByメソッドを使用してカスタムオブジェクトのリストを注文しています。
mylist.AsQueryable().OrderBy("PropertyName");
現在、複数のプロパティでソートすることを検討しています。それを行う方法はありますか?
ありがとう、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()は列挙可能なソート済みを返し、既存のリストをインプレースでソートしないことを忘れないでください。あなたの例では、ソートされたリストを変数に保存しませんでした。
.ThenBy
:
var result = mylist
.AsQueryable()
.OrderBy(x => x.PropertyName)
.ThenBy(x => x.SomeOtherProperty);
他の人が示唆しているように、「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;
});