ASP.NET(VB.NET)中如何按年龄排序Session内的搜索结果列表?
搞定ASP.NET Session中列表按年龄排序无效的问题
嘿,你的代码之所以没生效,核心问题在于Session("ListSearchResults")返回的是Object类型,不是强类型的泛型列表(比如List(Of Person)),直接调用.Sort()自然没法正确执行。另外还要确认你的人员数据是强类型类,要是用了匿名类型,Session序列化后类型信息会丢失,也会导致排序失败。
下面给你具体的解决步骤:
1. 先确认你的人员数据是强类型类
首先得有一个明确的类来存人员信息,比如:
Public Class Person Public Property Name As String Public Property Town As String Public Property Age As Integer End Class
要是之前用的是匿名类型,赶紧改成这种强类型类,不然Session里的数据类型会出问题。
2. 强类型转换后再排序
排序前先把Session里的对象转成List(Of Person),再执行排序。如果要保留排序后的结果,记得重新存回Session:
' 先检查Session里的值存在且是正确类型 If Session("ListSearchResults") IsNot Nothing AndAlso TypeOf Session("ListSearchResults") Is List(Of Person) Then ' 转成强类型列表 Dim searchResults As List(Of Person) = DirectCast(Session("ListSearchResults"), List(Of Person)) ' 按年龄升序排(要降序的话,把x.Age和y.Age调换就行) searchResults.Sort(Function(x, y) x.Age.CompareTo(y.Age)) ' 可选:把排序后的结果存回Session,下次用就是排好序的了 Session("ListSearchResults") = searchResults End If
3. 更直观的替代方案:用LINQ排序
如果你觉得Sort方法不够好懂,也可以用LINQ的OrderBy来生成排序后的新列表:
If Session("ListSearchResults") IsNot Nothing AndAlso TypeOf Session("ListSearchResults") Is List(Of Person) Then Dim originalList As List(Of Person) = DirectCast(Session("ListSearchResults"), List(Of Person)) ' 按年龄升序生成新列表 Dim sortedList As List(Of Person) = originalList.OrderBy(Function(p) p.Age).ToList() ' 存回Session Session("ListSearchResults") = sortedList End If
注意哦:LINQ的OrderBy会返回新列表,而Sort是直接修改原列表,你可以根据自己的需求选。
一些常见坑要注意
- 要是报错说没法访问CompareTo:检查你的
Age属性是不是数值类型(比如Integer),如果是字符串类型,得先转成数值再比,不然会按字符串字典序排(比如"10"会排在"2"前面,这肯定不是你想要的)。 - 如果Session里存的是
ArrayList而不是泛型List:建议先转成List(Of Person)再排序,因为ArrayList是非泛型集合,Sort的委托参数类型不匹配,也会导致失败。
内容的提问来源于stack exchange,提问作者Manuel van den Notelaer
相关产品推荐
相关产品推荐

