繁体   English   中英

VB.Net使用属性名对列表进行排序

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM