1

我正在使用自定义列表来存储联系人:

    Dim Contacts As List(Of Contact) = New List(Of Contact)

    ' Create a new contact
    Dim CurrentContact As Contact = New Contact With { _
        .Name = "Manolo el del Bombo", _
        .Country = "Spain", _
        .City = "Valencia", _
        .Street = "Av. Mestalla", _
        .ZipCode = "42731", _
        .Phone = "96.XXX.XX.XX", _
        .CellPhone = "651.XXX.XXX", _
        .Email = "ManoloToLoko@Gmail.es"}

    ' Add a contact to contacts list
    Contacts.Add(CurrentContact)

现在我想做的是创建一个通用函数来通过成员变量对联系人进行排序或重新排序,并指定升序或降序模式,我试过这样做:

Private Function Sort_ContactList(ByVal ContactList As List(Of Contact), _
                                  ByVal Field As Expressions.Expression(Of Func(Of Object))) As List(Of Contact)

    Dim member As Linq.Expressions.MemberInitExpression = _
        If(TypeOf Field.Body Is Linq.Expressions.UnaryExpression, _
        DirectCast(DirectCast(Field.Body, Linq.Expressions.UnaryExpression).Operand, Linq.Expressions.MemberInitExpression), _
        DirectCast(Field.Body, Linq.Expressions.MemberInitExpression))

    ' MsgBox(OrderedContacts.First.Name & " " & OrderedContacts.First.Country)
    Return (From contact In ContactList Order By member Ascending Select contact).ToList()

End Function

我这样调用函数:

Contacts = Sort_ContactList(Contacts, Function() New Contact With {.Name = Nothing})

此时我有两个问题:

  1. 不知道如何将 Ascending/Descending 关键字作为函数的参数传递以正确使用它。

  2. 该函数不会对列表进行排序,可能问题出在我正在使用的 Lambda 表达式或我对成员表达式的检查中,因为我对这些事情没有经验。

有人可以帮我吗?

更新:

Contact 类包含这些私有成员:

Private mId As System.Guid
Private mName As String
Private mCountry As String
Private mCity As String
Private mStreet As String
Private mZip As String
Private mPhone As String
Private mCellPhone As String
Private mEmail As String

..我认为这意味着我不能通过这样的 lambda:

Sort_ContactList(Contacts, Function() Contact.mName)
4

1 回答 1

1

你为什么不直接使用OrderByand OrderByDescending

OrderBy并且OrderByDescending是通用的,您可以对它们使用 lambda 方法。

代替:

Sort_ContactList(Contacts, Function() Contact.Name)

只需使用:

Contacs.OrderBy(Function(c) c.Name)
于 2013-10-14T11:11:45.893 回答