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

时间:2014-03-07 14:28:27

标签: vb.net linq list sorting

我有一个包含Client个对象的列表。我想使用它的属性名称升序或降序对列表进行排序,我已经在viewstate的代码中对其进行了排序:ViewState("PropertyName")ViewState("Order")

Dim objList As List(Of Client) = Session("ClientList")  
objList.Sort(ViewState("PropertyName") + " " + ViewState("Order"))    
datarepeater.datasource = objList

我怎样才能做到这一点?

2 个答案:

答案 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()