【问题标题】:Issue with Lambda to sort a list使用 Lambda 对列表进行排序的问题
【发布时间】:2013-10-14 11:01:57
【问题描述】:

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

    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)

【问题讨论】:

  • 你为什么不直接使用OrderByOrderByDescending
  • @Dominic Kexel 感谢您的评论,但使用其他任何方法(.Sort + Comparers,.Orderby + Thenby)我会遇到同样的问题,通常排序很容易,但就像我说的我需要使用 lambda 使函数中的排序通用化,这对我来说并不容易。
  • OrderByOrderByDescending 是通用的,您可以对它们使用 lambda 方法,所以我仍然没有看到问题。为什么不用Sort_ContactList(Contacts, Function() Contact.Name) 而不是Contacs.OrderBy(Function(c) c.Name)
  • 问题 1:我认为这不是必需的。我想如果需要,LINQ 表达式中的 Ascending/Descending 关键字将自动调用反转排序列表的内容(默认情况下假定为 ascending)。问题2,澄清:在多大程度上可以修改您的Contact 类?通常,在这种情况下,如果排序类(在这种情况下为 Contact)提供了一种通过某些标识符/索引(传递给 Field 参数)返回属性值(适合排序)的方法,事情会变得容易得多而不是基于反射的方法。
  • @Dominic Kexel 哎呀,真的,你已经解决了我的问题,非常感谢,如果你想将评论转换为回答我会标记的。 PS:原谅我的英语

标签: .net vb.net linq list lambda


【解决方案1】:

为什么不直接使用OrderByOrderByDescending

OrderByOrderByDescending 是通用的,您可以对它们使用 lambda 方法。

代替:

Sort_ContactList(Contacts, Function() Contact.Name)

简单地使用:

Contacs.OrderBy(Function(c) c.Name)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 2010-10-17
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多