我有一个包含Client
个对象的列表。我想使用它的属性名称升序或降序对列表进行排序,我已经在viewstate的代码中对其进行了排序:ViewState("PropertyName")
和ViewState("Order")
Dim objList As List(Of Client) = Session("ClientList")
objList.Sort(ViewState("PropertyName") + " " + ViewState("Order"))
datarepeater.datasource = objList
我怎样才能做到这一点?
答案 0 :(得分:4)
通常情况下,如果您知道要对其进行排序的属性,则可以执行以下操作:
clients.Sort(Function(x, y) x.Name.CompareTo(y.Name))
在上面的例子中,我当然是对Name
属性进行排序(我不知道Client
类有哪些属性,我只是以它为例。 / p>
但是,由于您不知道在运行时要使用哪个属性,因此您需要执行更复杂的操作。如果您确实想使用类的实际属性名称,可以使用 Reflection 动态检索属性的值,例如:
clients.Sort(Function(x, y)
Dim xProperty As PropertyInfo = x.GetType().GetProperty(ViewState("PropertyName").ToString)
Dim yProperty As PropertyInfo = y.GetType().GetProperty(ViewState("PropertyName").ToString)
Dim xValue As Object = xProperty.GetValue(x)
Dim yValue As Object = yProperty.GetValue(y)
Return xValue.ToString().CompareTo(yValue.ToString())
End Function)
要反转排序顺序,只需将返回值乘以-1
,或者将要比较的对象切换为什么。例如:
If ViewState("Order") = "Ascending" Then
Return xValue.ToString().CompareTo(yValue.ToString())
Else
Return yValue.ToString().CompareTo(xValue.ToString())
End If
答案 1 :(得分:1)
你也可以使用Linq(使用Steven Doggart提出的相同的一般方法):
sorted = lst.OrderBy(Function(x) x.GetType().GetProperty(_strColumnName01).GetValue(x)). _
ThenBy(Function(x) x.GetType().GetProperty(_strColumnName02).GetValue(x)).ToList()
在我的特定示例中,我需要按两列排序,但只需一列:
sorted = lst.OrderBy(Function(x) x.GetType().GetProperty(_strColumnName01).GetValue(x)).ToList()