Dot-Net

linq 為列表排序(MyObjects)

  • September 17, 2020

如何在我的對象列表中按傳遞的字元串值排序?我需要對我的 List(Of) 對象進行分頁和排序,分頁沒問題,但我不知道該讓誰來工作。

這是我目前正在做的事情,效果很好:

Return returnReports.Skip(PageSize * (PageNumber-1)).Take(PageSize).ToList()

我怎樣才能讓它工作?

Return returnReports.OrderBy(SortColumn).Skip(skip).Take(PageSize).ToList()

SortColumn 是傳遞的字元串值

VB

Module OrderByExtensions
 <System.Runtime.CompilerServices.Extension()> _
 Public Function OrderByPropertyName(Of T)(ByVal e As IEnumerable(Of T), ByVal propertyName As String) As IOrderedEnumerable(Of T)
   Dim itemType = GetType(T)
   Dim prop = itemType.GetProperty(propertyName)
   If prop Is Nothing Then Throw New ArgumentException("Object does not have the specified property")
   Dim propType = prop.PropertyType
   Dim funcType = GetType(Func(Of ,)).MakeGenericType(itemType, propType)
   Dim parameter = Expression.Parameter(itemType, "item")
   Dim exp = Expression.Lambda(funcType, Expression.MakeMemberAccess(parameter, prop), parameter)
   Dim params = New Object() {e, exp.Compile()}
   Return DirectCast(GetType(OrderByExtensions).GetMethod("InvokeOrderBy", Reflection.BindingFlags.Static Or Reflection.BindingFlags.NonPublic).MakeGenericMethod(itemType, propType).Invoke(Nothing, params), IOrderedEnumerable(Of T))
 End Function
 Private Function InvokeOrderBy(Of T, U)(ByVal e As IEnumerable(Of T), ByVal f As Func(Of T, U)) As IOrderedEnumerable(Of T)
   Return Enumerable.OrderBy(e, f)
 End Function
End Module

C#

public static class OrderByExtensions
{
 public static IOrderedEnumerable<T> OrderByPropertyName<T>(this IEnumerable<T> e, string name)
 {
   var itemType = typeof(T);
   var prop = itemType.GetProperty(name);
   if (prop == null) throw new ArgumentException("Object does not have the specified property");
   var propType = prop.PropertyType;
   var funcType = typeof(Func<,>).MakeGenericType(itemType, propType);
   var parameter = Expression.Parameter(itemType, "item");
   var memberAccess = Expression.MakeMemberAccess(parameter, prop);
   var expression = Expression.Lambda(funcType, memberAccess, parameter);
   var x = typeof(OrderByExtensions).GetMethod("InvokeOrderBy", BindingFlags.Static | BindingFlags.NonPublic);
   return (IOrderedEnumerable<T>)x.MakeGenericMethod(itemType, propType).Invoke(null, new object[] { e, expression.Compile() });
 }
 static IOrderedEnumerable<T> InvokeOrderBy<T, U>(IEnumerable<T> e, Func<T, U> f)
 {
   return e.OrderBy(f);
 }
}

引用自:https://stackoverflow.com/questions/606997