[英]VB.Net Sort a List using property name
我有一个包含Client
对象的列表。 我想通过使用它的属性名称升序或降序对列表进行排序,我在视图状态的代码中已有: ViewState("PropertyName")
和ViewState("Order")
Dim objList As List(Of Client) = Session("ClientList")
objList.Sort(ViewState("PropertyName") + " " + ViewState("Order"))
datarepeater.datasource = objList
我怎样才能做到这一点?
通常情况下,如果您知道要对其进行排序的属性,则可以执行以下操作:
clients.Sort(Function(x, y) x.Name.CompareTo(y.Name))
在上面的例子中,我当然是对Name
属性进行排序(我不知道Client
类有哪些属性,我只是以它为例)。
但是,由于您不知道在运行时要使用哪个属性,因此您需要执行更复杂的操作。 如果您确实想使用类的实际属性名称,可以使用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
您也可以使用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()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.