更好至按任何财产列表方式 [英] Better way to Sort a List by any property
问题描述
我的方法接收所有数据表的参数按列点击排序表。我把从每一页列表的控制器此方法。
我在寻找更好的方法来做到这一点像所有类型的泛型方法:字符串 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屋!