Lambda/Linqを使ったオブジェクトへのリストのソート
私は、"sort by property"の名前を文字列で持っています。Lambda/Linqを使ってオブジェクトのリストをソートする必要があります。
Ex:
public class Employee
{
public string FirstName {set; get;}
public string LastName {set; get;}
public DateTime DOB {set; get;}
}
public void Sort(ref List<Employee> list, string sortBy, string sortDirection)
{
//Example data:
//sortBy = "FirstName"
//sortDirection = "ASC" or "DESC"
if (sortBy == "FirstName")
{
list = list.OrderBy(x => x.FirstName).toList();
}
}
1.フィールド名をチェックするために多くのifを使用する(sortBy)代わりに、ソートを行うためのよりクリーンな方法はありますか? 2.sort はデータ型を意識していますか?
263
3
ひとつは、
Sort
を変更して、ラムダをうまく利用することです。これで
Sort
メソッドを呼び出す際に、ソートするフィールドを指定できるようになりました。Reflectionを使って、プロパティの値を取得することができます。
TypeHelperが以下のようなスタティックメソッドを持っているところ。
また、VS2008 Samples libraryのDynamic LINQを見てみるのもいいかもしれません。 IEnumerable 拡張を使用して List を IQueryable としてキャストし、Dynamic link OrderBy 拡張を使用することができます。
**1.の答え:***。
あなたは、名前を文字列として使用してOrderByに渡すことができる式ツリーを手動で構築することができるはずです。あるいは、他の回答で提案されているようにリフレクションを使用することができ、それはより少ない作業かもしれません。
Edit: ここに手動で式木を構築する作業例があります。(プロパティの名前"Value"しか知らないときに、X.Valueでソートします)。)これを実行するための一般的なメソッドを構築することができます(すべきです)。
しかし、式木を構築するには、参加する型を知っている必要があります。それはあなたの使用シナリオでは問題になるかもしれませんし、ならないかもしれません。どの型でソートすべきかわからない場合は、リフレクションを使った方が簡単でしょう。
**2.の答え:***。
はい、Comparer.Defaultが比較のために使用されます。