2013-09-21 88 views
0

樹lambda表達式我有一個方法,通過一個ObjectDataSource饋送GridView和允許使用lambda表達式由列排序:建設泛型列表

public IList<UsersEntity> GetUsers() 
    { 
     return new List<UsersEntity>(new[] { 
      new UsersEntity{ UsrId =1, UsrName="Luis" }, 
      new UsersEntity{ UsrId = 2, UsrName = "Pablo"} }); 
    } 

    public IList<UsersEntity> GetUsers(string OrderBy) 
    { 
     string[] ordParts = OrderBy.Split(' '); 
     string ordBy = ordParts[0]; 
     string direction = "ASC"; 
     if (2 == ordParts.Length) 
      direction = "DESC"; 

     //Get Unsorted List 
     List<UsersEntity> Lista = (List<UsersEntity>)GetUsers(); 

     //Function to order 
     Func<UsersEntity, object> myFunct = null; 
     myFunct = (usr) => { 
      if ("UsrId" == ordBy) return usr.UsrId; 
      else return usr.UsrName; 
     }; 

     //sort list 
     if ("ASC" == direction) 
      return Lista.OrderBy(myFunct).ToList(); 
     else 
      return Lista.OrderByDescending(myFunct).ToList(); 

    } 

但我想要的東西更實用的東西,對於所有類型的作品列表並且不涉及添加大量代碼。所以我寫了這個功能,我無法完成:

public class OrdenarEntidades<T> 
{ 
    public static IEnumerable<T> SortList(IEnumerable<T> Listado, string OrderByArg) 
    { 
     string[] arrOrderBy = OrderByArg.Split(' '); 
     string orderBy = arrOrderBy[0]; 
     string direction = "ASC"; 
     if (2 == arrOrderBy.Length) 
      direction = "DESC"; 

     foreach (PropertyInfo pInfo in typeof(T).GetProperties()) 
     { 
      if (orderBy == pInfo.Name) 
      { 
       Type tipDev = pInfo.PropertyType; 
       Func<T, tipDev> MyFunct = (Entity) => { pInfo.GetValue(Entity, null); }; 

       if ("ASC" == direction) 
        Listado.OrderBy(MyFunct); 
       else 
        Listado.OrderBy(MyFunct); 
      } 
     } 

     return Listado; 
    } 
} 

我知道這個代碼不編譯,但表達了我想要完成的想法。

Marc Gravell給出了一個近似什麼我正在尋找(here),但不知道怎樣使它適應我的代碼

在此之前,非常感謝你。

+0

http://stackoverflow.com/questions/41244/dynamic-linq-orderby-on-ienumerablet –

+0

多想想你的問題......是什麼上下文你要使用的功能?似乎只是包裝linq功能很麻煩。 OrderBy字符串是否存儲在數據庫中? –

回答

0

你需要像

public class OrdenarEntidades<T> 
{ 
    public static IOrderedEnumerable<T> SortList(IEnumerable<T> Listado, params Func<T, object>[] orders) 
    { 
     if(orders.Length == 0) 
      return Listado; 
     IOrderedEnumerable<T> result = Listado.OrderBy(orders[0]); 
     for(int i = 1; i < orders.Length; ++i) 
      result = result.ThenBy(orders[i]); 
     return result; 
    } 
} 

這僅支持升序排列。要允許這兩個方向在包含Func<T, object>的類中使用基於其調用OrderByOrderByDescending的方向屬性。

該函數可以這樣調用

var usersSorted = OrdenarEntidades<UserEntity>.SortList(users, user=>user.UsrId, user=>user.UsrName); 
+0

這沒有任何意義。調用'OrderBy()'多次實際上只排序一次,最後一次使用排序。 – svick

+0

當然,沒有任何意義。用ThenBy替換後續的'OrderBy'來解決這個問題。 –