LINQ按属性名字符串排序

7
我有一个需要排序的列表,例如:
var list = someelements;

我也有一个参数,用于指定按照哪个属性以及何种方向对列表数据进行排序。
var sortby = "Name";
var sortdirection = "desc";

我想知道是否可以将字符串属性名与正确的属性匹配,以便获得:
var list = someelements.OrderBy(x => x.Name).ToList();

sortby == "Name"时,无需使用switch循环来检查属性名称并将正确的属性分配给OrderBy。

同样,我希望能够通过选择OrderByOrderByDescending来实现,具体取决于我是否获取sortdirection = "asc"sortdirection = "desc"

这是否可能,如果是,如何做到?


基于 sortDirection 值依赖于 OrderByOrderByDescending 是非常直接的:使用条件(即使是三元运算符在这种情况下也可以胜任)。 - varocarbas
可能是重复的问题:如何使用动态字符串参数进行OrderBy? - mkimmet
2个回答

6
您可以通过Nuget获取Dynamic Linq。然后您可以使用.OrderBy(sortby + " " + sortdirection)。这是链接:Dynamic Linq

谢谢你的回答,我使用了这个库在 .net core 上的端口: https://www.nuget.org/packages/System.Linq.Dynamic.Core - MIP1983

6

以下是一个不使用Dynamic Linq的解决方案:

public class Helper
{
    public static IEnumerable<T> OrderByDynamic<T>(IEnumerable<T> items, string sortby, string sort_direction)
    {
        var property = typeof (T).GetProperty(sortby);

        var result = typeof(Helper)
            .GetMethod("OrderByDynamic_Private", BindingFlags.NonPublic | BindingFlags.Static)
            .MakeGenericMethod(typeof (T), property.PropertyType)
            .Invoke(null, new object[]{ items, sortby, sort_direction});

        return (IEnumerable<T>)result;
    }

    private static IEnumerable<T> OrderByDynamic_Private<T,TKey>(IEnumerable<T> items, string sortby, string sort_direction)
    {
        var parameter = Expression.Parameter(typeof (T), "x");

        Expression<Func<T, TKey>> property_access_expression =
            Expression.Lambda<Func<T, TKey>>(
                Expression.Property(parameter, sortby),
                parameter);

        if (sort_direction == "asc")
        {
            return items.OrderBy(property_access_expression.Compile());
        }

        if (sort_direction == "desc")
        {
            return items.OrderByDescending(property_access_expression.Compile());
        }

        throw new Exception("Invalid Sort Direction");
    }
}

你可以这样使用它:
var result = Helper.OrderByDynamic(list, "Name", "desc").ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接