更好至按任何财产列表方式 [英] Better way to Sort a List by any property

查看:260
本文介绍了更好至按任何财产列表方式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的方法接收所有数据表的参数按列点击排序表。我把从每一页列表的控制器此方法。
我在寻找更好的方法来做到这一点像所有类型的泛型方法:字符串 INT 小数 双击 布尔可为空不可以)。但我找不到它。



我当前的代码:



<预类=郎-CS prettyprint,覆盖> 公开名单< T> OrderingList< T>(列表< T>列表,DataTablesParam模型)
{
VAR iColumn = model.Order.FirstOrDefault()列。
VAR财产= typeof运算(T).GetProperty(model.Columns.ToArray()[iColumn]。数据);
VAR参数= Expression.Parameter(typeof运算(T));
变种最终= Expression.Property(参数,属性);

VAR isDirAsc = model.Order.FirstOrDefault()Dir.Equals(ASC)。

如果(property.PropertyType == typeof运算(字符串))
{
变种的λ= Expression.Lambda< Func键< T,串>>(最终,参数)。编译();
返回isDirAsc? list.OrderBy(拉姆达).ToList():list.OrderByDescending(拉姆达).ToList();
}
,否则如果(property.PropertyType == typeof运算(INT))
{
变种的λ= Expression.Lambda< Func键< T,INT>>(最终,参数).Compile();
返回isDirAsc? list.OrderBy(拉姆达).ToList():list.OrderByDescending(拉姆达).ToList();
}
,否则如果(property.PropertyType == typeof运算(布尔))
{
变种的λ= Expression.Lambda< Func键< T,BOOL>>(最终,参数).Compile();
返回isDirAsc? list.OrderBy(拉姆达).ToList():list.OrderByDescending(拉姆达).ToList();
}
,否则如果(property.PropertyType == typeof运算(十进制))
{
变种的λ= Expression.Lambda< Func键< T,小数>>(最终,参数).Compile();
返回isDirAsc? list.OrderBy(拉姆达).ToList():list.OrderByDescending(拉姆达).ToList();
}
,否则如果(property.PropertyType == typeof运算(双))
{
变种的λ= Expression.Lambda< Func键< T,双>>(最终,参数).Compile();
返回isDirAsc? list.OrderBy(拉姆达).ToList():list.OrderByDescending(拉姆达).ToList();
}

返回列表;
}






我想做的事情这样的事情:(但是这个代码不工作)



<预类=郎-CS prettyprint-覆盖> 公开名单< T> OrderingList< T>(列表< T>列表,DataTablesParam模型)
{
VAR iColumn = model.Order.FirstOrDefault()列。
VAR财产= typeof运算(T).GetProperty(model.Columns.ToArray()[iColumn]。数据);
VAR参数= Expression.Parameter(typeof运算(T));
变种最终= Expression.Property(参数,属性);

VAR isDirAsc = model.Order.FirstOrDefault()Dir.Equals(ASC)。

VAR波长= Expression.Lambda<&Func键LT; T,动态>>(最终,参数).Compile();
返回isDirAsc? list.OrderBy(拉姆达).ToList():list.OrderByDescending(拉姆达).ToList();
}





解决方案

我找到了一个更好的办法来做到这一点。我不得不做的3个步骤:



1 - 添加项目包的LINQ动态:

 安装封装System.Linq.Dynamic.Library 

2 - 导入包中类:



<预类=郎-CS prettyprint-覆盖> 使用System.Linq.Dynamic;



3 - 按财产的字符串名称顺序列表:



<预类=郎-CS prettyprint-覆盖> list.OrderBy(stringPropertyName); // ASC
list.OrderBy(stringPropertyName +降); // DES



它完美地为我工作。


My method receives all DataTables parameters to sort table by column clicked. I call this method from controller of each page list. I'm looking for a better way to do this like a generic method for all types: string, int, decimal, double, bool (nullable or not). But I can't find it.

My current code:

public List<T> OrderingList<T>(List<T> list, DataTablesParam model)
{
    var iColumn = model.Order.FirstOrDefault().Column;
    var property = typeof(T).GetProperty(model.Columns.ToArray()[iColumn].Data);
    var param = Expression.Parameter(typeof(T));
    var final = Expression.Property(param, property);

    var isDirAsc = model.Order.FirstOrDefault().Dir.Equals("asc");

    if (property.PropertyType == typeof(string))
    {
        var lambda = Expression.Lambda<Func<T, string>>(final, param).Compile();
        return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
    }
    else if (property.PropertyType == typeof(int))
    {
        var lambda = Expression.Lambda<Func<T, int>>(final, param).Compile();
        return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
    }
    else if (property.PropertyType == typeof(bool))
    {
        var lambda = Expression.Lambda<Func<T, bool>>(final, param).Compile();
        return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
    }
    else if (property.PropertyType == typeof(decimal))
    {
        var lambda = Expression.Lambda<Func<T, decimal>>(final, param).Compile();
        return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
    }
    else if (property.PropertyType == typeof(double))
    {
        var lambda = Expression.Lambda<Func<T, double>>(final, param).Compile();
        return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
    }

    return list;
}


I want to do something like this: (But this code doesn't work)

public List<T> OrderingList<T>(List<T> list, DataTablesParam model)
{
    var iColumn = model.Order.FirstOrDefault().Column;
    var property = typeof(T).GetProperty(model.Columns.ToArray()[iColumn].Data);
    var param = Expression.Parameter(typeof(T));
    var final = Expression.Property(param, property);

    var isDirAsc = model.Order.FirstOrDefault().Dir.Equals("asc");

    var lambda = Expression.Lambda<Func<T, dynamic>>(final, param).Compile();
    return isDirAsc ? list.OrderBy(lambda).ToList() : list.OrderByDescending(lambda).ToList();
}


解决方案

I found a better way to do this. I had to do 3 steps:

1 - Add the package "Linq Dynamic" in project:

Install-Package System.Linq.Dynamic.Library

2 - Import the package in Class:

using System.Linq.Dynamic;

3 - Order list by the string name of property:

list.OrderBy(stringPropertyName);                 //asc
list.OrderBy(stringPropertyName + " descending"); //des

It work perfectly for me.

这篇关于更好至按任何财产列表方式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆