如何对类属性排序后存入ArrayList并解决Repeater刷新顺序变动问题
嗨,这个问题我熟!问题出在Cookie的Values集合本身是无序的——它的存储顺序不固定,刷新页面后Cookie值的读取顺序可能就变了,导致Repeater里的项跟着乱。要解决这个问题,你只需要在把objCard对象存入ArrayList后,根据类里的某个属性(比如ID、名称这类有排序意义的字段)对ArrayList做一次明确排序就行。
我结合你的代码给你具体实现方案:
首先先补全你原来的代码(假设objCard有Id、CardName这类属性):
Dim myCookies As HttpCookie = HttpContext.Current.Request.Cookies("Mycard") Dim varArryItems As ArrayList = New ArrayList() For i As Integer = 0 To myCookies.Values.Count - 1 Dim AllValues As String() = myCookies.Values(i).Split("|"c) Dim item As objCard = New objCard() ' 这里根据你的Split结果给objCard属性赋值,比如: item.Id = Integer.Parse(AllValues(0)) item.CardName = AllValues(1) ' 其他属性赋值... varArryItems.Add(item) Next
接下来给你两种排序方式,选一种适合你的就行:
方式一:自定义比较器类(适合需要复用排序逻辑的场景)
先写一个实现IComparer接口的比较器类,用来定义objCard的排序规则:
Public Class CardComparer Implements IComparer Public Function Compare(x As Object, y As Object) As Integer Implements IComparer.Compare ' 把Object转成你的objCard类型 Dim cardX As objCard = DirectCast(x, objCard) Dim cardY As objCard = DirectCast(y, objCard) ' 这里按Id升序排序,如果要降序就反过来写:cardY.Id.CompareTo(cardX.Id) Return cardX.Id.CompareTo(cardY.Id) End Function End Class
然后在添加完所有objCard对象后,调用ArrayList的Sort方法:
' 对ArrayList进行排序 varArryItems.Sort(New CardComparer())
方式二:用委托/ Lambda表达式(更简洁,适合单次排序)
如果只是临时排序,不需要复用逻辑,可以直接用委托或者Lambda表达式,省去写单独的比较器类:
用委托函数
' 先定义一个比较函数 Private Function CompareCards(x As Object, y As Object) As Integer Dim cardX As objCard = DirectCast(x, objCard) Dim cardY As objCard = DirectCast(y, objCard) ' 这里可以换成你需要排序的属性,比如按CardName不区分大小写排序 Return String.Compare(cardX.CardName, cardY.CardName, StringComparison.OrdinalIgnoreCase) End Function ' 添加完所有item后调用排序 varArryItems.Sort(AddressOf CompareCards)
用Lambda表达式(.NET 3.5及以上支持)
这是最简洁的写法,直接把排序逻辑写在Sort方法里:
varArryItems.Sort(Function(x, y) Dim cardX As objCard = DirectCast(x, objCard) Dim cardY As objCard = DirectCast(y, objCard) ' 按Id升序排序 Return cardX.Id.CompareTo(cardY.Id) End Function)
额外建议:换成泛型List(Of objCard)
其实ArrayList是旧的非泛型集合,建议换成List(Of objCard),类型更安全,排序也更方便:
' 替换ArrayList为泛型List Dim cardList As New List(Of objCard)() ' 遍历Cookie添加item的代码和之前一样 For i As Integer = 0 To myCookies.Values.Count - 1 Dim AllValues As String() = myCookies.Values(i).Split("|"c) Dim item As objCard = New objCard() item.Id = Integer.Parse(AllValues(0)) item.CardName = AllValues(1) cardList.Add(item) Next ' 排序更简单,直接用泛型的Sort方法 cardList.Sort(Function(c1, c2) c1.Id.CompareTo(c2.Id))
排序完成后,再把集合绑定到Repeater,这样不管页面怎么刷新,Repeater里的项都会按照你指定的属性顺序排列啦!
内容的提问来源于stack exchange,提问作者Rebin Qadir
相关产品推荐
相关产品推荐

