Avatar billede Slettet bruger
01. august 2006 - 00:14 Der er 28 kommentarer og
1 løsning

Lave sin egen collection

Hej

Jeg vil gerne lave min egen collection. Jeg forestiller mig f.eks. at have et objekt som ser ud som følger:

Public Class obj
    Private _a As Integer
    Private _b As String
    Private _c As Date

    Public Sub New(ByVal a As Integer, ByVal b As String, ByVal c As Date)
        _a = a
        _b = b
        _c = c

    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 Property C() As Date
        Get
            Return _c
        End Get
        Set
            _c = value
        End Set
    End Property

Jeg vil så gerne lave en collection af disse, med funktioner der kan add, remove, sort osv, men hvordan gøres det smartes:

Public class objCollection

??????????????
?????????????
????????????

End class

På Forhånd tak.
Avatar billede arne_v Ekspert
01. august 2006 - 00:16 #1
.NET 2.0 : System.Collections.Generic.List
.NET 1.x : System.Collections.CollectionBase
Avatar billede arne_v Ekspert
01. august 2006 - 00:17 #2
der er eksempel i http://www.eksperten.dk/artikler/694 dog i C#
Avatar billede arne_v Ekspert
01. august 2006 - 02:27 #3
i VB.NET ser eksemplet ud som:

Imports System
Imports System.Collections.Generic

Public Class MyData
    Private m_s As String
    Public Sub New()
        Me.New("")
    End Sub
    Public Sub New(ByVal s As String)
        Me.m_s = s
    End Sub
    Public Overloads Overrides Function ToString() As String
        Return m_s
    End Function
    Public Property S() As String
        Get
            Return m_s
        End Get
        Set
            m_s = value
        End Set
    End Property
End Class

Class TypSafCol2
    Public Shared Sub Main(ByVal args As String())
        Dim mycol As List(Of MyData) = New List(Of MyData)()
        mycol.Add(New MyData("A"))
        mycol.Add(New MyData("BB"))
        mycol.Add(New MyData("CCC"))
        For i As Integer = 0 To mycol.Count - 1
            Console.WriteLine(mycol(i))
        Next
    End Sub
End Class
Avatar billede Slettet bruger
01. august 2006 - 09:57 #4
Hej

Hvad er forskellen på på nedenstående to måder at definerer sin collection på:

Public Class MyCollection
  Inherits CollectionBase
 
  Default Public ReadOnly Property Item(index As Integer) As MyData
      Get
        Return CType(List(index), MyData)
      End Get
  End Property
 
  Public Function Add(value As MyData) As Integer
      Return List.Add(value)
  End Function 'Add
End Class 'MyCollection
___________________________________________________________


Class TypSafCol2
    Public Shared Sub Main(ByVal args As String())
        Dim mycol As List(Of MyData) = New List(Of MyData)()
        mycol.Add(New MyData("A"))
        mycol.Add(New MyData("BB"))
        mycol.Add(New MyData("CCC"))
        For i As Integer = 0 To mycol.Count - 1
            Console.WriteLine(mycol(i))
        Next
    End Sub
End Class
Avatar billede arne_v Ekspert
02. august 2006 - 02:54 #5
når man bruger generics så sparer man selv at skrive en klasse
Avatar billede Slettet bruger
02. august 2006 - 07:59 #6
Er det ene at foretrække frem for det andet?
Avatar billede arne_v Ekspert
02. august 2006 - 12:59 #7
hvis man har .NET 2.0 så har jeg svært ved at se hvorfor du ikke skulle foretrække
generics
Avatar billede Slettet bruger
08. august 2006 - 02:14 #8
Det er som om der er 100 mia. måde at gøre det på :-| ?? Jeg kan ikke rigtig blive klog på hvordan det gøres smartes.

Jeg vil jo helst ikke løbe ind i alt for mange begrænsninger i forbindelse med at sortere, binde til grids osv.

Det jeg har nu er:

    Public Class Person
            Private _Id As Integer
            Private _Fornavne As String
            Private _Efternavn As String
            Private _Tlf As String
            Private _Birth As Date

            Public Sub New()

            End Sub

            Public Sub New( _
                ByVal Id As Integer, _
                ByVal Fornavne As String, _
                ByVal Efternavn As String, _
                ByVal Tlf As String, _
                ByVal Birth As Date)

            Public Property Id() As Integer
                Get
                    Return _Id
                End Get
                Set(ByVal value As Integer)
                    _Id = value
                End Set
            End Property

            Public Property Fornavne() As String
                Get
                    Return _Fornavne
                End Get
                Set(ByVal value As String)
                    _Fornavne = value
                End Set
            End Property

            Public Property Efternavn() As String
                Get
                    Return _Efternavn
                End Get
                Set(ByVal value As String)
                    _Efternavn = value
                End Set
            End Property

            Public Property Tlf() As String
                Get
                    Return _Tlf
                End Get
                Set(ByVal value As String)
                    _Tlf = value
                End Set
            End Property

            Public Property Birth() As Date
                Get
                    Return _Birth
                End Get
                Set(ByVal value As Date)
                    _Birth = value
                End Set
            End Property

        End Class

        Public Class PersonCollection

            Dim PersonCol As List(Of Person) = New List(Of Person)()

            Public Sub Add(ByVal item As Person)
                PersonCol.Add(item)
            End Sub

            Public Function Sort(ByVal ) 'her vil jeg f.eks. gerne sortere efter tlf

            End Function

        End Class

Er det lang fra hvad der er en god måde at gøre det på - og hvordan gøres den sortering smart?

(Arne_V -> jeg ved at du sikkert har skrevet det til mig før, men jeg har mistet overblikket )
Avatar billede arne_v Ekspert
08. august 2006 - 02:33 #9
drop PersonCollection klassen og brug bare List(Of Person) hvor du ellers ville
bruge den

List(Of Person) har en Sort metode som du bare kan bruge
Avatar billede Slettet bruger
08. august 2006 - 11:02 #10
...men hvornår er det så smart at lave sin egen collection?
Avatar billede arne_v Ekspert
08. august 2006 - 13:15 #11
i .NET 1.x

:-)
Avatar billede Slettet bruger
08. august 2006 - 19:33 #12
:-) OK.

Er følgende tæt på noget man kan være bekendt?
Jeg har følgnede 4 lag: DAL, BLL, PL og COMMON
Jeg har en db med lovdokumenter
Jeg vil gerne præsentere en liste med dokumenterne og det skal være muligt at sortere kollonnerne og vælge ud efter forskellige kriterier.

---------------------------------------------------------------

DAL: (Bør man benytte interface og er det ok at "Imports System.Collections.Generic" ??? )

Imports Microsoft.VisualBasic
Imports Common.LovSamlingCommon
Imports System
Imports System.Data
Imports System.Data.OleDb
Imports System.Collections.Generic

  Public Class LovDokumetDB

            Public Function GetAllLovDokumenter() As List(Of LovDokument)

                Dim DBConn As DataHelperClass = New DataHelperClass
                Dim Conn As OleDbConnection = DBConn.GetConnection()

                Dim SqlCmd As New OleDbCommand("SELECT l.Nummer, l.Ny_lovgivning , l.Gruppe_nummer, l.Gruppe_navn, l.Link, l.Dokumenttype," & _
                "l.Forskriftens_nummer, l.Aendring_til, l.Dato, l.Forskriftens_titel, l.Printet, l.Placering, l.Status, l.Populaertitel FROM Lovsamling As l", Conn)
                Dim Reader As OleDbDataReader = SqlCmd.ExecuteReader
                'Dim LovDokumentCol As LovDokumentCollection = New LovDokumentCollection
                Dim LovDokumentList As List(Of LovDokument) = New List(Of LovDokument)()


                While Reader.Read
                    Dim objLovDokumnet As LovDokument = New LovDokument

                    objLovDokumnet.Id = Reader("Nummer")
                    If Not Reader("Ny_lovgivning") Is DBNull.Value Then
                        objLovDokumnet.NyLovgivning = Reader("Ny_lovgivning")
                    Else
                        objLovDokumnet.NyLovgivning = ""
                    End If
                    objLovDokumnet.Gruppenr = Reader("Gruppe_nummer")
                    If Not Reader("Gruppe_navn") Is DBNull.Value Then
                        objLovDokumnet.Gruppenavn = Reader("Gruppe_navn")
                    Else
                        objLovDokumnet.Gruppenavn = ""
                    End If
                    If Not Reader("Link") Is DBNull.Value Then
                        objLovDokumnet.Link = Reader("Link")
                    Else
                        objLovDokumnet.Link = ""
                    End If
                    objLovDokumnet.Dokumenttype = Reader("Dokumenttype")
                    objLovDokumnet.Forskriftens_nummer = Reader("Forskriftens_nummer")
                    If Not Reader("Aendring_til") Is DBNull.Value Then
                        objLovDokumnet.Aendring_til = Reader("Aendring_til")
                    Else
                        objLovDokumnet.Aendring_til = ""
                    End If
                    If Not Reader("Dato") Is DBNull.Value Then
                        objLovDokumnet.Dato = Reader("Dato")
                    Else
                        objLovDokumnet.Dato = Nothing
                    End If
                    If Not Reader("Forskriftens_titel") Is DBNull.Value Then
                        objLovDokumnet.Forskriftens_titel = Reader("Forskriftens_titel")
                    Else
                        objLovDokumnet.Forskriftens_titel = ""
                    End If
                    objLovDokumnet.Printet = Reader("Printet")
                    If Not Reader("Placering") Is DBNull.Value Then
                        objLovDokumnet.Placering = Reader("Placering")
                    Else
                        objLovDokumnet.Placering = ""
                    End If
                    objLovDokumnet.Status = Reader("Status")
                    If Not Reader("Populaertitel") Is DBNull.Value Then
                        objLovDokumnet.Populaertitel = Reader("Populaertitel")
                    Else
                        objLovDokumnet.Populaertitel = ""
                    End If
                    LovDokumentList.Add(objLovDokumnet)
                End While

                Return LovDokumentList

            End Function 'GetLovDokumenter

        End Class 'LovDokumetDB
-----------------------------------------------------------------------------

BLL:
Imports Microsoft.VisualBasic
Imports Common.LovSamlingCommon
Imports System.Collections.Generic

        Public Class LovsamlingManager

            Public Function GetAllLovgivning()

                Dim objAllLov As DAL.Lovgivning.ILovdokument = New DAL.Lovgivning.LovDokumetDB
                Dim objLovList As List(Of LovDokument) = objAllLov.GetAllLovDokumenter
                Return objLovList
            End Function 'GetAllLovgivning

        End Class 'LovsamlingManager

-----------------------------------------------------------

PL/Codebehind:

Imports BLL
Imports BLL.LovsamlingBLL
Imports Common.LovSamlingCommon
Imports System.Collections.Generic

Partial Class Modules_Lovsamling_lovsamling_index
    Inherits System.Web.UI.Page

    Sub Page_Load()
        If Not IsPostBack Then

            'Henter alle uafsluttede afvigelser og binder til datagrid
            Dim objBLL As LovsamlingManager = New LovsamlingManager
            Dim LovDokumentList As List(Of LovDokument) = objBLL.GetAllLovgivning

            'Binder til datagrid
            Lovsamling.DataSource = LovDokumentList
            Lovsamling.DataBind()

        End If

    End Sub 'Page_Load

-------------------------------------------------------------------

COMMON:

Namespace LovsamlingCommon

        Public Class LovDokument
            Private _Id As Integer
            Private _NyLovgivning As Date
            Private _Gruppenr As Integer
            Private _Gruppenavn As String
            Private _Link As String
            Private _Dokumenttype As String
            Private _Forskriftens_nummer As Integer
            Private _Aendring_til As String
            Private _Dato As Date
            Private _Forskriftens_titel As String
            Private _Printet As Boolean
            Private _Placering As String
            Private _Status As Boolean
            Private _Populaertitel As String
            Private _AfdelingsID As Integer
            Private _Afdelingsref As Integer
            Private _AfdelingsNr As String
            Private _AfdelingsNavn As String

            Public Sub New()

            End Sub

            Public Sub New( _
            ByVal Id As Integer, _
            ByVal NyLovgivning As Date, _
            ByVal Gruppenr As String, _
            ByVal Gruppenavn As String, _
            ByVal Link As String, _
            ByVal Dokumenttype As String, _
            ByVal Forskriftens_nummer As Integer, _
            ByVal Aendring_til As String, _
            ByVal Dato As Date, _
            ByVal Forskriftens_titel As String, _
            ByVal Printet As Boolean, _
            ByVal Placering As String, _
            ByVal Status As Boolean, _
            ByVal Populaertitel As String, _
            ByVal AfdelingsID As Integer, _
            ByVal Afdelingsref As Integer, _
            ByVal AfdelingsNr As String, _
            ByVal AfdelingsNavn As String)

                _Id = Id
                _NyLovgivning = NyLovgivning
                _Gruppenr = Gruppenr
                _Gruppenavn = Gruppenavn
                _Link = Link
                _Dokumenttype = Dokumenttype
                _Forskriftens_nummer = Forskriftens_nummer
                _Aendring_til = Aendring_til
                _Dato = Dato
                _Forskriftens_titel = Forskriftens_titel
                _Printet = Printet
                _Placering = Placering
                _Status = Status
                _Populaertitel = Populaertitel
                _AfdelingsID = AfdelingsID
                _Afdelingsref = Afdelingsref
                _AfdelingsNr = AfdelingsNr
                _AfdelingsNavn = AfdelingsNavn

            End Sub


            Public Property Id() As Integer
                Get
                    Return _Id
                End Get
                Set(ByVal value As Integer)
                    _Id = value
                End Set
            End Property

            Public Property NyLovgivning() As Date
                Get
                    Return _NyLovgivning
                End Get
                Set(ByVal value As Date)
                    _NyLovgivning = value
                End Set
            End Property

            Public Property Gruppenr() As Integer
                Get
                    Return _Gruppenr
                End Get
                Set(ByVal value As Integer)
                    _Gruppenr = value
                End Set
            End Property

            Public Property Gruppenavn() As String
                Get
                    Return _Gruppenavn
                End Get
                Set(ByVal value As String)
                    _Gruppenavn = value
                End Set
            End Property

            Public Property Link() As String
                Get
                    Return _Link
                End Get
                Set(ByVal value As String)
                    _Link = value
                End Set
            End Property

            Public Property Dokumenttype() As String
                Get
                    Return _Dokumenttype
                End Get
                Set(ByVal value As String)
                    _Dokumenttype = value
                End Set
            End Property

            Public Property Forskriftens_nummer() As Integer
                Get
                    Return _Forskriftens_nummer
                End Get
                Set(ByVal value As Integer)
                    _Forskriftens_nummer = value
                End Set
            End Property

            Public Property Aendring_til() As String
                Get
                    Return _Aendring_til
                End Get
                Set(ByVal value As String)
                    _Aendring_til = value
                End Set
            End Property

            Public Property Dato() As Date
                Get
                    Return _Dato
                End Get
                Set(ByVal value As Date)
                    _Dato = value
                End Set
            End Property

            Public Property Forskriftens_titel() As String
                Get
                    Return _Forskriftens_titel
                End Get
                Set(ByVal value As String)
                    _Forskriftens_titel = value
                End Set
            End Property

            Public Property Printet() As Boolean
                Get
                    Return _Printet
                End Get
                Set(ByVal value As Boolean)
                    _Printet = value
                End Set
            End Property

            Public Property Placering() As String
                Get
                    Return _Placering
                End Get
                Set(ByVal value As String)
                    _Placering = value
                End Set
            End Property

            Public Property Status() As Boolean
                Get
                    Return _Status
                End Get
                Set(ByVal value As Boolean)
                    _Status = value
                End Set
            End Property

            Public Property Populaertitel() As String
                Get
                    Return _Populaertitel
                End Get
                Set(ByVal value As String)
                    _Populaertitel = value
                End Set
            End Property

            Public Property AfdelingsID() As Integer
                Get
                    Return _AfdelingsID
                End Get
                Set(ByVal value As Integer)
                    _AfdelingsID = value
                End Set
            End Property

            Public Property Afdelingsref() As Integer
                Get
                    Return _Afdelingsref
                End Get
                Set(ByVal value As Integer)
                    _Afdelingsref = value
                End Set
            End Property

            Public Property AfdelingsNr() As String
                Get
                    Return _AfdelingsNr
                End Get
                Set(ByVal value As String)
                    _AfdelingsNr = value
                End Set
            End Property

            Public Property AfdelingsNavn() As String
                Get
                    Return _AfdelingsNavn
                End Get
                Set(ByVal value As String)
                    _AfdelingsNavn = value
                End Set
            End Property

        End Class 'Class LovDokument

------------------------------------------------------------

Hvor og hvordan skal jeg lave de funktioner der sorterer efter f.eks. Forskriftens_titel ?

I det jeg har prøvet på, spørger jeg fra PL ind i BLL, der jo dykker ned i DAL og DB, hvorefter jeg sorterer og binder til datagrid. Men er det nødvendigt??


PS. sig til hvis spørgsmåle er blevet for stort til 60 points.
Avatar billede arne_v Ekspert
09. august 2006 - 01:36 #13
Imports System.Collections.Generic er helt fint

jeg kan som nævnt i tidligere spørgsmål godt lide interfaces og en factory

det der BLL er jo ret "tyndt" - hvis aldrig der kommer mere funktionalitet, så
behøves det ikke, men hvis der senere kan komme noget funktionalitet så behold det

den indbyggede List klasse har en Sort metode du kan bruge
Avatar billede Slettet bruger
09. august 2006 - 02:25 #14
Hej

Sorry - jeg ved at jeg gentager nogle af mine spørgsmål.
Avatar billede Slettet bruger
12. august 2006 - 23:46 #15
Hej igen

Nu har jeg rodet meget længe med det her, men jeg forstår det altså ikke endnu, så jeg håber du har lidt tålmodighed.

Jeg forstår ikke helt hvordan jeg skal bruge "list(of person)".

Jeg tænker at det er smartes at have "list(of person)" i et "common-layer". Når jeg så skal præsentere data binder jeg til list(of person) i common. Hvis jeg så efterfølgende skal præsentere data anderleds, ligger den komplette "list(of person)" i common-layer og den kan så modificeres på den ene eller anden måde uden atter at tilgå databasen for at hente data igen. Jeg kan dog ikke helt for denne tanke til at stemme overens med at du siger at jeg skal droppe PersonCollection klassen.
1. Er det helt skævt at have "list(of person)" i et "common-layer"?

Jeg kan godt fylde min "list(of person)" fra databasen, men jeg kan ikke tilgå den senere uden at bede den om at kigge ned i databasen igen.
2. Hvordan ”gemmer” jeg "list(of person)", så jeg f.eks. kan sortere på data uden at bede den om at kigge ned i databasen igen.

      Public Class Person
            Private _Id As Integer
            Private _Fornavne As String
            Private _Efternavn As String
            Private _Tlf As String
            Private _Birth As Date

            Public Sub New()

            End Sub

            Public Sub New( _
                ByVal Id As Integer, _
                ByVal Fornavne As String, _
                ByVal Efternavn As String, _
                ByVal Tlf As String, _
                ByVal Birth As Date)
                _Id = Id
                _Fornavne = Fornavne
                _Efternavn = Efternavn
                _Tlf = Tlf
                _Birth = Birth

            End Sub

            Public Property Id() As Integer
                Get
                    Return _Id
                End Get
                Set(ByVal value As Integer)
                    _Id = value
                End Set
            End Property

            Public Property Fornavne() As String
                Get
                    Return _Fornavne
                End Get
                Set(ByVal value As String)
                    _Fornavne = value
                End Set
            End Property

            Public Property Efternavn() As String
                Get
                    Return _Efternavn
                End Get
                Set(ByVal value As String)
                    _Efternavn = value
                End Set
            End Property

            Public Property Tlf() As String
                Get
                    Return _Tlf
                End Get
                Set(ByVal value As String)
                    _Tlf = value
                End Set
            End Property

            Public Property Birth() As Date
                Get
                    Return _Birth
                End Get
                Set(ByVal value As Date)
                    _Birth = value
                End Set
            End Property

        End Class 'Class Person

        Public Class PersonList(Of Person)
            Inherits CollectionBase


            Default Public Property Item(ByVal index As Integer) As Person
                Get
                    Return CType(InnerList(index), Person)
                End Get

                Set(ByVal Value As Person)
                    InnerList(index) = Value
                End Set

            End Property

            Public Function Add(ByVal value As Person) As Integer
                Return InnerList.Add(value)
            End Function

            Public Function IndexOf(ByVal value As Person) As Integer
                Return InnerList.IndexOf(value)
            End Function

            Public Sub Insert(ByVal index As Integer, ByVal value As Person)
                InnerList.Insert(index, value)
            End Sub

            Public Sub Remove(ByVal value As Person)
                InnerList.Remove(value)
            End Sub

            Public Function Contains(ByVal value As Person) As Boolean
                Return InnerList.Contains(value)
            End Function

        End Class 'Class PersonList
Avatar billede Slettet bruger
13. august 2006 - 00:09 #16
Vent lidt - jeg er vist noget galt på den. Jeg kigger lidt mere på det....
Avatar billede Slettet bruger
13. august 2006 - 00:23 #17
Nej - jeg kan ikke gennemskue det (jf. indlæg kl. 23:46:12).
Avatar billede arne_v Ekspert
13. august 2006 - 04:19 #18
først - den ikke type sikre version:

Imports System
Imports System.Collections

Namespace E
    Public Class MyData
        Private _v As Integer
        Private _s As String

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

        Public Sub New(ByVal v As Integer, ByVal s As String)
            _v = v
            _s = s
        End Sub

        Public Property V() As Integer
            Get
                Return _v
            End Get
            Set
                _v = value
            End Set
        End Property

        Public Property S() As String
            Get
                Return _s
            End Get
            Set
                _s = value
            End Set
        End Property

        Public Overloads Overrides Function ToString() As String
            Return ("(" & _v & "," & _s & ")")
        End Function
    End Class

    Public Class MyDataComparerV
    Implements IComparer
        Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
            Return (CType(o1, MyData).V - CType(o2, MyData).V)
        End Function
    End Class

    Public Class MyDataComparerS
    Implements IComparer
        Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
            Return CType(o1, MyData).S.CompareTo(CType(o2, MyData).S)
        End Function
    End Class

    Public Class MainClass
        Public Shared Sub Main(ByVal args As String())
            Dim al As ArrayList = New ArrayList
            al.Add(New MyData(2, "A"))
            al.Add(New MyData(1, "CCC"))
            al.Add(New MyData(3, "BB"))
            Dim i As Integer
            For i = 0 To al.Count-1
                Console.WriteLine(al(i))
            Next
            al.Sort(New MyDataComparerV)
            For i = 0 To al.Count-1
                Console.WriteLine(al(i))
            Next
            al.Sort(New MyDataComparerS)
            For i = 0 To al.Count-1
                Console.WriteLine(al(i))
            Next
        End Sub
    End Class
End Namespace
Avatar billede arne_v Ekspert
13. august 2006 - 04:25 #19
så den type sikre som man lavede den i .NET 1.x ved at lave en egen klasse
som extender ColelctionBase:

Imports System
Imports System.Collections

Namespace E
    Public Class MyData
        Private _v As Integer
        Private _s As String

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

        Public Sub New(ByVal v As Integer, ByVal s As String)
            _v = v
            _s = s
        End Sub

        Public Property V() As Integer
            Get
                Return _v
            End Get
            Set
                _v = value
            End Set
        End Property

        Public Property S() As String
            Get
                Return _s
            End Get
            Set
                _s = value
            End Set
        End Property

        Public Overloads Overrides Function ToString() As String
            Return ("(" & _v & "," & _s & ")")
        End Function
    End Class

    Public Class MyDataCollection
    Inherits CollectionBase
        Default Public ReadOnly Property Blubber(ByVal index As Integer) As MyData
            Get
                Return CType(List(index), MyData)
            End Get
        End Property

        Public Function Add(ByVal value As MyData) As Integer
            Return List.Add(value)
        End Function

        Public Sub Sort(ByVal cmp As IComparer)
            Me.InnerList.Sort(cmp)
        End Sub
    End Class

    Public Class MyDataComparerV
    Implements IComparer
        Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
            Return (CType(o1, MyData).V - CType(o2, MyData).V)
        End Function
    End Class

    Public Class MyDataComparerS
    Implements IComparer
        Function Compare(ByVal o1 As Object, ByVal o2 As Object) As Integer Implements IComparer.Compare
            Return CType(o1, MyData).S.CompareTo(CType(o2, MyData).S)
        End Function
    End Class

    Public Class MainClass
        Public Shared Sub Main(ByVal args As String())
            Dim mdc As MyDataCollection = New MyDataCollection
            mdc.Add(New MyData(2, "A"))
            mdc.Add(New MyData(1, "CCC"))
            mdc.Add(New MyData(3, "BB"))
            Dim i As Integer
            For i = 0 To mdc.Count-1
                Console.WriteLine(mdc(i))
            Next
            mdc.Sort(New MyDataComparerV)
            For i = 0 To mdc.Count-1
                Console.WriteLine(mdc(i))
            Next
            mdc.Sort(New MyDataComparerS)
            For i = 0 To mdc.Count-1
                Console.WriteLine(mdc(i))
            Next
        End Sub
    End Class
End Namespace
Avatar billede arne_v Ekspert
13. august 2006 - 04:29 #20
og så den type sikre med .NET 2.0 generics:

Imports System
Imports System.Collections.Generic

Namespace E
    Public Class MyData
        Private _v As Integer
        Private _s As String
        Public Sub New()
            Me.New(0, "")
        End Sub
        Public Sub New(ByVal v As Integer, ByVal s As String)
            _v = v
            _s = s
        End Sub
        Public Property V() As Integer
            Get
                Return _v
            End Get
            Set
                _v = value
            End Set
        End Property
        Public Property S() As String
            Get
                Return _s
            End Get
            Set
                _s = value
            End Set
        End Property
        Public Overloads Overrides Function ToString() As String
            Return ("(" & _v & "," & _s & ")")
        End Function
    End Class
    Public Class MainClass
        Private Shared Function MyDataComparerV(ByVal o1 As MyData, ByVal o2 As MyData) As Integer
            Return (o1.V - o2.V)
        End Function
        Private Shared Function MyDataComparerS(ByVal o1 As MyData, ByVal o2 As MyData) As Integer
            Return o1.S.CompareTo(o2.S)
        End Function
        Public Shared Sub Main(ByVal args As String())
            Dim mdc As List(Of MyData) = New List(Of MyData)()
            mdc.Add(New MyData(2, "A"))
            mdc.Add(New MyData(1, "CCC"))
            mdc.Add(New MyData(3, "BB"))
            For i As Integer = 0 To mdc.Count-1
                Console.WriteLine(mdc(i))
            Next
            mdc.Sort(AddressOf MyDataComparerV)
            For i As Integer = 0 To mdc.Count-1
                Console.WriteLine(mdc(i))
            Next
            mdc.Sort(AddressOf MyDataComparerS)
            For i As Integer = 0 To mdc.Count-1
                Console.WriteLine(mdc(i))
            Next
        End Sub
    End Class
End Namespace
Avatar billede Slettet bruger
13. august 2006 - 15:53 #21
Meget fornemt - mange tak.
Avatar billede Slettet bruger
13. august 2006 - 19:58 #22
Nu har jeg fået det til at præsenterer listen, men jeg kan ikke få det til at virke uden at der dykkes ned i databasen hver gang. Er det ikke muligt at undgå og er det ikke smartes?

Mit common layer:

    Public Class LovdokumentList
            Private Shared Function _ComparerID(ByVal o1 As LovDokument, ByVal o2 As LovDokument) As Integer
                Return (o1.Id - o2.Id)
            End Function

            Private Shared Function _ComparerDokumentType(ByVal o1 As LovDokument, ByVal o2 As LovDokument) As Integer
                Return o1.Dokumenttype.CompareTo(o2.Dokumenttype)
            End Function

            Public Shared Function Main()
                Dim MyLovdokumentList As List(Of LovDokument) = New List(Of LovDokument)()
                Dim objBLL As BLL.LovsamlingBLL.LovsamlingManagerBLL

                If objBLL Is Nothing Then
                    objBLL = New BLL.LovsamlingBLL.LovsamlingBLL
                    MyLovdokumentList.AddRange(objBLL.GetAllLovdokument(2, "DokumentType"))
                Else
                    MyLovdokumentList.AddRange(objBLL)
                End If
                Return MyLovdokumentList
            End Function

            Public Function ComparerID()
                Dim MyLovdokumentList As List(Of LovDokument) = New List(Of LovDokument)()
                Dim objBLL As BLL.LovsamlingBLL.LovsamlingManagerBLL

                If objBLL Is Nothing Then
                    objBLL = New BLL.LovsamlingBLL.LovsamlingBLL
                    MyLovdokumentList.AddRange(objBLL.GetAllLovdokument(2, "DokumentType"))
                Else
                    MyLovdokumentList.AddRange(objBLL)
                End If
                MyLovdokumentList.Sort(AddressOf _ComparerID)
                Return MyLovdokumentList
            End Function

        End Class

Codebehind der binder listen til et grid:

          'Binder til datagrid
            Lovsamling.DataSource = LovdokumentList.Main()
            Lovsamling.DataBind()


Codebehind der skal sortere - men det skulle helst ske uden at der igen dykkes ned i db, skal det ikke?

        Dim Temp As LovdokumentList = New LovdokumentList

      Lovsamling.DataSource = Temp.ComparerID

        Lovsamling.DataBind()
Avatar billede arne_v Ekspert
14. august 2006 - 04:06 #23
måske skulle du flytte sorteringen op i din code behind ?

sortering er da ihvertfald UI
Avatar billede Slettet bruger
14. august 2006 - 11:53 #24
Hvordan?
Avatar billede arne_v Ekspert
15. august 2006 - 02:42 #25
du gemmer listen i session

så kan du sortere den på forskellige måder og binder den til din UI kontrol
Avatar billede Slettet bruger
15. august 2006 - 12:38 #26
Ok. Er det virkelig sådan man gør det - altså gemmer den i en session-variabel?

Tak for hjælpen og tålmodigheden.

Sender du et svar?
Avatar billede arne_v Ekspert
15. august 2006 - 13:13 #27
hvis du vil gemme data mellem requests så lyder det som den rigtige løsning

og svar
Avatar billede Slettet bruger
15. august 2006 - 14:46 #28
Men er det ikke smartere end at skulle ned og læse i databasen hver gang der skal sorteres, udvælges eller sådan?
Avatar billede arne_v Ekspert
16. august 2006 - 00:23 #29
jo forudsat at det er de samme data som skal vises og at databasen ikke er blevet
opdateret af en anden i mellem tiden
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



IT-JOB

Udviklings- og Forenklingsstyrelsen

Generalist med flair for økonomi i projekter og drift

De Nationale Geologiske Undersøgelser for Danmark og Grønland (GEUS)

IT-systemadministrator søges til GEUS

Danske Commodities A/S

IT Systems Engineer