2011-08-04 121 views
0

排序名單上有一個表,我想要做的每一列排序功能。使用反射

排序具有兩個方向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(); 

    } 
+2

爲什麼[標籤:java描述]標籤? –

+0

爲什麼思考,如果你有Person類? –

+0

也不需要[標籤:網絡開發],因爲雖然你可能在做網絡開發,但是這個知識不需要回答這個問題,問題與它無關。 –

回答

1

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(); 
4

嘗試這樣的事情

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); 
} 
+0

我喜歡這個,它爲我工作,但我意識到我需要排序的多個領域,不只是一個:( –