.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)
在这一点上,我有两个问题:
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,没错,你已经解决了我的问题,非常感谢你,我意识到我对这个问题及其解决方案的想法不太好,如果你想把评论转化为答案,我会记下来。请原谅我的英语