You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对类属性排序后存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:19:02