Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 使用Lambda对列表进行排序_.net_Vb.net_Linq_List_Lambda - Fatal编程技术网

.net 使用Lambda对列表进行排序

.net 使用Lambda对列表进行排序,.net,vb.net,linq,list,lambda,.net,Vb.net,Linq,List,Lambda,我正在使用自定义列表存储联系人: 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 = "

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

    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})
Sort_ContactList(Contacts, Function() Contact.mName)
在这一点上,我有两个问题:

  • 不知道如何将升序/降序关键字作为函数的参数传递以正确使用它

  • 该函数不会对列表进行排序,可能问题出在我使用的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:

    Contacts = Sort_ContactList(Contacts, Function() New Contact With {.Name = Nothing})
    
    Sort_ContactList(Contacts, Function() Contact.mName)
    
    你为什么不直接使用和

    和是泛型的,可以使用lambda方法

    而不是:

    Sort_ContactList(Contacts, Function() Contact.Name)
    
    只需使用:

    Contacs.OrderBy(Function(c) c.Name)
    
    你为什么不直接使用和

    和是泛型的,可以使用lambda方法

    而不是:

    Sort_ContactList(Contacts, Function() Contact.Name)
    
    只需使用:

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

    为什么不直接使用
    OrderBy
    OrderByDescending
    ?@Dominic Kexel感谢您的评论,但使用其他任何方法(.Sort+比较器、.OrderBy+Thenby)我会遇到同样的问题,排序通常很容易,但正如我所说,我需要在使用lambda的函数中使其成为通用排序,还有一些地方对我来说并不容易。
    OrderBy
    OrderByDescending
    是通用的,您可以对它们使用lambda方法,所以我仍然看不出问题所在。与其对联系人列表(Contacts,Function()Contact.Name)进行排序,为什么不直接对Contacs.OrderBy(Function(c)c.Name)?问题1:我认为这不是必需的。我假设LINQ表达式中的
    升序
    /
    降序
    关键字将自动调用反转排序列表的内容(如果需要)(
    升序
    默认设置)。问题2,澄清:在多大程度上可以修改您的
    联系人
    课程?通常,在这种情况下,如果排序类(
    在本例中为Contact
    )提供了一种通过某种标识符/索引(传递给
    字段
    参数)而不是基于反射的方法返回属性值(适合排序)的方法,事情就会变得容易得多。@Dominic Kexel oops,没错,你已经解决了我的问题,非常感谢你,我意识到我对这个问题及其解决方案的想法不太好,如果你想把评论转化为答案,我会记下来。PS:请原谅我的英语为什么你不直接使用
    OrderBy
    OrderByDescending
    ?@Dominic Kexel谢谢你的评论,但是使用任何其他的方法(.Sort+比较器,.OrderBy+Thenby)我也会遇到同样的问题,排序通常很容易,但是就像我说过的,我需要使它成为通用的,使用lambda在函数中进行排序,这对我来说并不容易。
    OrderBy
    OrderByDescending
    是通用的,可以使用lambda方法,所以我仍然看不出问题。与其对联系人列表(Contacts,Function()Contact.Name)进行排序,为什么不直接对Contacs.OrderBy(Function(c)c.Name)?问题1:我认为这不是必需的。我假设LINQ表达式中的
    升序
    /
    降序
    关键字将自动调用反转排序列表的内容(如果需要)(
    升序
    默认设置)。问题2,澄清:在多大程度上可以修改您的
    联系人
    课程?通常,在这种情况下,如果排序类(
    在本例中为Contact
    )提供了一种通过某种标识符/索引(传递给
    字段
    参数)而不是基于反射的方法返回属性值(适合排序)的方法,事情就会变得容易得多。@Dominic Kexel oops,没错,你已经解决了我的问题,非常感谢你,我意识到我对这个问题及其解决方案的想法不太好,如果你想把评论转化为答案,我会记下来。请原谅我的英语