Avatar billede Slettet bruger
22. juni 2006 - 14:39 Der er 9 kommentarer og
1 løsning

Sorterer og eller filtrer efter en bestemt værdi i arraylist

Hej

Jeg har lavet mig et datagrid, så jeg kan vise en arraylist jeg har.

Min arraylist indeholder objekter med egenskaberne:
id
overskrift
afd

Jeg vil nu gerne kunne sortere efter f.eks. overskrift og jeg vil gerne kunne vælge alle med afd = 100

Hvordan gøres det? På forhånd tak.
Avatar billede arne_v Ekspert
22. juni 2006 - 16:12 #1
mit standard multi sorterings eksempel:

Imports System
Imports System.Collections

Public Class Foobar
Implements IComparable
    Private _a As Integer
    Private _b As String

    Public Sub New()
        MyClass.New(0, "")
    End Sub

    Public Sub New(ByVal a As Integer, ByVal b As String)
        _a = a
        _b = b
    End Sub

    Public Property A() As Integer
        Get
            Return _a
        End Get
        Set
            _a = value
        End Set
    End Property
    Public Property B() As String
        Get
            Return _b
        End Get
        Set
            _b = value
        End Set
    End Property
    Public Function CompareTo(ByVal o As Object) As Integer Implements IComparable.CompareTo
        Return (_a - CType(o, Foobar).A)
    End Function
    Public Overloads Overrides Function ToString() As String
        Return ("(" & _a & "," & _b & ")")
    End Function
End Class

Public Class FoobarAComparer
Implements IComparer
    Public Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
        Return (CType(o1, Foobar).A - CType(o2, Foobar).A)
    End Function
End Class

Public Class FoobarRevAComparer
Implements IComparer
    Public Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
        Return -(CType(o1, Foobar).A - CType(o2, Foobar).A)
    End Function
End Class

Public Class FoobarBComparer
Implements IComparer
    Public Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
        Return (CType(o1, Foobar).B.CompareTo(CType(o2, Foobar).B))
    End Function
End Class

Public Class FoobarRevBComparer
Implements IComparer
    Public Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
        Return -(CType(o1, Foobar).B.CompareTo(CType(o2, Foobar).B))
    End Function
End Class

Class ManySort
    Private Shared Sub print(ByVal descr As String, ByVal list As ArrayList)
        Console.Write(descr + ": [")
        For Each o As Object In list
            Console.Write(o)
        Next
        Console.WriteLine("]")
    End Sub
    Public Shared Sub Main(ByVal args As String())
        Dim list As ArrayList = New ArrayList
        list.Add(New Foobar(5, "AAAAA"))
        list.Add(New Foobar(4, "BBBB"))
        list.Add(New Foobar(3, "CCC"))
        list.Add(New Foobar(2, "DD"))
        list.Add(New Foobar(1, "E"))
        print("Original", list)
        list.Sort
        print("After natural sort (= sort on A)", list)
        list.Sort(New FoobarRevAComparer)
        print("After reverse sort on A", list)
        list.Sort(New FoobarAComparer)
        print("After sort on A", list)
        list.Sort(New FoobarBComparer)
        print("After sort on B", list)
        list.Sort(New FoobarRevBComparer)
        print("After reverse sort on B", list)
    End Sub
End Class
Avatar billede arne_v Ekspert
22. juni 2006 - 16:19 #2
i .NET 1.x maa du nok lave en ny ArrayList med det relevante udsnit  manuelt

i .NET 2.x kan du bruge en List<DinKlasse> og bruge FindAll metoden
Avatar billede arne_v Ekspert
22. juni 2006 - 16:24 #3
Jeg ved ikke hvad der maatte vaere af muligheder i DataGrid
Avatar billede Slettet bruger
04. juli 2006 - 11:17 #4
Tak. Men jeg forstår faktik ikke helt hvad der sker - kan jeg få lidt forklaring til?
Avatar billede Slettet bruger
04. juli 2006 - 11:17 #5
Jeg bruger .NET 2.x
Avatar billede arne_v Ekspert
04. juli 2006 - 22:27 #6
hvis man laver en Sort uden at angive en Comparer så bruger den CompareTo metoden
i den klasse som man sorterer

hvis man angiver en Comparer i sin Sort så bruges dens Compare metode
Avatar billede Slettet bruger
31. juli 2006 - 15:30 #7
Hej

Kan:
Public Class FoobarBComparer
Implements IComparer
    Public Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
        Return (CType(o1, Foobar).B.CompareTo(CType(o2, Foobar).B))
    End Function
End Class

ikke laves så property (B) sendes med. Således at det ikke er nødvendigt at lave en function til hver property?
Avatar billede arne_v Ekspert
31. juli 2006 - 15:49 #8
nej

men i .NET 2.0 kan du for generics List (som svarer til ArrayList) sortere
med kun en funktion fremfor en hel klasse
Avatar billede Slettet bruger
01. august 2006 - 00:15 #9
Hej

Jeg må vist tage et skridt tilbage og beder om hjælp til hvordan man laver sig egen collection. Venligst se: 723424

Det kan godt være at det lapper lidt over ovenstående, men jeg må have lidt mere hjælp.

Arne_v -> sender du et svar - tak for hjælpen.
Avatar billede arne_v Ekspert
01. august 2006 - 02:24 #10
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester