0

以下のように注文するための複数行の条件があります

if (enum1)
{
     var = itemlist.orderby(r => r.column1)
}
else if (emum2)
{
     var = itemlist.orderby(r => r.column2)
}

など..そのようなことを動的に行う方法。

4

3 に答える 3

4

できることは、たとえばKeySelectorのFunc <>を保持するコレクションを使用するなど、並べ替えのための列選択をより適切に管理することです。

たとえば、4つのプロパティProp1、2、3、4を持つクラス名'SomeDTO'があり、対応する4つの列挙型メンバーがあるとします。

var searchByMapping = new Dictionary<SearchByEnum,Func<SomeDTO, object>>();
searchByMapping.Add(SearchByEnum.Prop1, x => x.Prop1);
searchByMapping.Add(SearchByEnum.Prop2, x => x.Prop2);
searchByMapping.Add(SearchByEnum.Prop3, x => x.Prop3);

coll = coll.OrderBy(searchByMapping[searchByEnumParam]).ToList();

これはそれほど動的なアプローチではありませんが、タイプセーフなアプローチです。

于 2013-02-19T13:13:52.940 に答える
0

以下の拡張メソッドを使用しました。

public static class IQueryableExtensions
    {
        public static IQueryable<T> OrderBy<T>(this IQueryable<T> items, string propertyName)
        {
            var typeOfT = typeof(T);
            var parameter = Expression.Parameter(typeOfT, "parameter");
            var propertyType = typeOfT.GetProperty(propertyName).PropertyType;
            var propertyAccess = Expression.PropertyOrField(parameter, propertyName);
            var orderExpression = Expression.Lambda(propertyAccess, parameter);

            var expression = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { typeOfT, propertyType }, items.Expression, Expression.Quote(orderExpression));
            return items.Provider.CreateQuery<T>(expression);
        }
    }
于 2013-02-19T13:05:03.387 に答える
0

あなたの列挙型が2つの値しか持てないと仮定すると: enum yourEnum( X=0, Y}

enum1 はどこかに設定されていました:

itemlist = enum1==Enum.X? itemlist.Orderby(r => r.column1): itemlist.Orderby(r => r.column2)
于 2013-02-19T12:50:47.273 に答える