使用反射排序列表

本文关键字:列表 排序 反射 | 更新日期: 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 ());