この署名を持つ単純なデータ クラスがあります。
internal interface IMyClass {
string Letter { get; }
int Number { get; }
}
string sortField
フィールド ( として指定) と方向 ( として指定)bool isAscending
に基づいて、このデータをソートできるようにしたいと考えています。
現在、私はを使用していswitch
ます(各ケース内の昇順ロジックを としてif
)
IEnumerable<IMyClass> lst = new IMyClass[];//provided as paramater
switch (sortField)
{
case "letter":
if( isAscending ) {
lst = lst.OrderBy( s => s.Letter );
} else {
lst = lst.OrderByDescending( s => s.Letter );
}
break;
case "number":
if( isAscending ) {
lst = lst.OrderBy( s => s.Number );
} else {
lst = lst.OrderByDescending( s => s.Number );
}
break;
}
s => s.Number
2 つのプロパティの場合、これはかなり醜いですが、並べ替えロジックが異なると問題になります (コード内で が 2 回重複していることもわかります)。
質問 ブール値を渡してソート方向を選択する最良の方法は何ですか?
System.Core.dll をバラバラにして 、OrderBy 拡張メソッドの実装を見つけました。
注文方法:
public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
){
return new OrderedEnumerable<TSource, TKey>(
source,
keySelector,
null,
false
);
}
降順:
public static IOrderedEnumerable<TSource> OrderByDescending<TSource, TKey>(
this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector
){
return new OrderedEnumerable<TSource, TKey>(
source,
keySelector,
null,
true
);
}
2 つの名前付きメソッドを持つ目的は、このブール値を抽象化することです。System.Core の内部にあるように、独自の拡張機能を簡単に作成することはできませOrderedEnumberable
ん。bool -> methodName -> bool から移動するレイヤーを作成することは、私には間違っているようです。