使用反射排序列表
本文关键字:列表 排序 反射 | 更新日期: 2023-09-27 18:04:25
我有一个表,我想为每一列做排序函数。
排序有两个方向asc和desc。
1)我如何使用反射排序列?
List<Person> GetSortedList(List<Person> persons, string direction, string column)
{
return persons.OrderBy(x => GetProperyByName(x, column)); //GetPropertyByName - ??
}
2)我还想做一些我可以称为linq操作符链的东西:
List<Person> GetSortedList(List<Person> persons, string direction, string column)
{
var linqChain;
if(direction=="up")
{
linqChain+=persons.OrderBy(x => GetProperyByName(x, column))
}
else
{
linqChain+=persons.OrderByDescending(x => GetProperyByName(x, column))
}
linqChain+=.Where(....);
return linqChain.Execute();
}
试试这样
public void SortListByPropertyName<T>(List<T> list, bool isAscending, string propertyName) where T : IComparable
{
var propInfo = typeof (T).GetProperty(propertyName);
Comparison<T> asc = (t1, t2) => ((IComparable) propInfo.GetValue(t1, null)).CompareTo(propInfo.GetValue(t2, null));
Comparison<T> desc = (t1, t2) => ((IComparable) propInfo.GetValue(t2, null)).CompareTo(propInfo.GetValue(t1, null));
list.Sort(isAscending ? asc : desc);
}
1)如果您想使用字符串列名排序,请使用Dynamic LINQ库。
if (direction == "ASC")
return persons.OrderBy(column);
else
return persons.OrderByDescending(column);
2)您可以使用表达式对象将LINQ表达式连接在一起。
Expression linqChain = persons;
if (direction == "up")
{
linqChain = linqChain.OrderBy(column);
}
else
{
linqChain = linqChain.OrderByDescending(column);
}
linqChain = linqChain.Where(...);
return linqChain.Execute();
最简单的方法就是使用Dynamic LINQ
return (direction == "? 人。OrderByDescending (x =比;x. gettype (). getproperty (column). getvalue (x)). tolist (): person。OrderBy (x =比;x.GetType () . getproperty(列).GetValue (x)) .ToList ());