Announcement

Collapse
No announcement yet.

Datum richtig deklarieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datum richtig deklarieren

    Hallo zusammen,

    mit dem Code aus VB 2005

    Array.Sort(SortDatum)

    möcht ich die Datumsangaben in dem Array "SortDatum" sortieren.

    Wenn ich die Elemente des Arrays als String deklariere, dann erfolgt die Sortierung nach den vorne stehenden Zahlen der Elemente.

    Wie muss ich das Array deklarieren, damit die Sortierung Datums richtig erfolgt?

    Und kann wie kann ich dann eine Stringvariable in dieses Format umwandeln und zurück?

    Danke im Voraus

    fredyx

  • #2
    Hi fredyx,

    nachfolgend ein Bsp das deine Fragen beantworten sollte.

    Code:
    Imports System
    
    Namespace ConsoleApplication1
    	Class Program
    		Public Shared Sub Main(ByVal args As String())
    			' Deklaration des Arrays:
    			Dim datumArray As DateTime() = New DateTime(9) {}
    
    			' Füllen des Arrays mit Zufalls-Daten. Hierzu werden
    			' zum aktuellen Datum zufällig Tage addiert:
    			Dim random As New Random()
    			For i As Integer = 0 To 9
    				datumArray(i) = DateTime.Now.AddDays(CDbl(random.[Next](20)))
    			Next
    
    			' Unsortierte Ausgabe:
    			Console.WriteLine("Unsortiert")
    			For i As Integer = 0 To 9
    				Console.WriteLine(datumArray(i))
    			Next
    
    			' Sortieren des Arrays. Die generische Version bevorzuge ich
    			' aufgrund der Typsicherheit:
    			'Array.Sort(datumArray);
    			Array.Sort(Of DateTime)(datumArray)
    
    			' Sortierte Ausgabe:
    			Console.WriteLine()
    			Console.WriteLine("Sortiert")
    			For i As Integer = 0 To 9
    				Console.WriteLine(datumArray(i))
    			Next
    
    			Console.ReadKey()
    			Console.WriteLine()
    
    			' Datum als String ausgeben:
    			Console.WriteLine(datumArray(0).ToString())
    			Console.WriteLine(datumArray(0).ToShortDateString())
    			Console.WriteLine(datumArray(0).ToLongDateString())
    
    			' Datum aus String erzeugen:
    			Console.WriteLine()
    			Dim datumString As String = "21.09.2008"
    			Dim datum As DateTime = DateTime.Parse(datumString)
    			Console.WriteLine(datum)
    
    			Console.ReadKey()
    		End Sub
    	End Class
    End Namespace
    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo gfoidl,

      wieder mal herzlichen Dank. Dein Vorschlag klappte in einer Konsolanwendung auf Anhieb.
      In meiner Windowsanwendung war es aber doch noch einfacher, da ich die Werte der Array-Elemente in DateTimePickern benötige, wurden die dort sofort ohne Umwandlung richtig dargestellt.
      Aber die Umwandlungen werde ich sicher auch noch mal gut gebrauchen können.

      Weißt Du evtl. auch, ob man ein Array mit mehreren Spalten nach einer Spalte sortieren kann? Wenn ja, wie?
      Gruß

      fredyx

      Comment


      • #4
        Hallo,

        zum Sortieren von mehrdimensionalen Arrays kann Array.Sort verwendet werden. Zum Bestimmen nach welcher Spalte sortiert werden soll kann der Methode eine Instanz einer Klasse die die IComparer-Schnittstelle implementiert übergeben werden.

        Ein Beispiel:
        Code:
        Imports System
        Imports System.Collections.Generic
        
        Namespace ConsoleApplication2
        	Class Program
        		Public Shared Sub Main(ByVal args As String())
        			Dim array As Integer()() = {New Integer() {1, 8, 3}, New Integer() {4, 5, 6}, New Integer() {7, 2, 9}}
        			
        			' Unsortierte Ausgabe:
        			For i As Integer = 0 To 2
        				For j As Integer = 0 To 2
        					Console.Write(array(i)(j))
        				Next
        				Console.WriteLine()
        			Next
        			Console.WriteLine()
        
        			' Sortieren nach der 2. Spalte (Index ist nullbasiert):
        			Dim myArrayComparer As New MyArrayComparer()
        			myArrayComparer.Spalte = 1
        			Array.Sort(array, myArrayComparer ())  ' Objekt das vergleicht
        			
        			' Sortierte Ausgabe:
        			For i As Integer = 0 To 2
        				For j As Integer = 0 To 2
        					Console.Write(array(i)(j))
        				Next
        				Console.WriteLine()
        			Next
        
        			Console.ReadKey()
        		End Sub
        	End Class
        
        	Public Class MyArrayComparer
        		Implements IComparer(Of Integer())
        		Private _spalte As Integer = 0
        		Public WriteOnly Property Spalte() As Integer
        			Set
        				_spalte = value
        			End Set
        		End Property
        
        		Private Function Compare(ByVal x As Integer(), ByVal y As Integer()) As Integer Implements IComparer(Of Integer()).Compare
        			Return x(_spalte).CompareTo(y(_spalte))
        		End Function
        	End Class
        End Namespace
        Der im Beispiel deklarierte Array wird als "jagged array" bezeichnet. Im Gegensatz zu einer Matrix ist das sortieren eines jagged arrays einfacher.

        mfG Gü
        Zuletzt editiert von gfoidl; 24.09.2008, 12:18.
        "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

        Comment


        • #5
          Hallo Gfoidl,

          ich mal wieder, ich habe den Code so wie Du ihn geschickt hast in eine Konsolanwendung kopiert und bekomme in der Zeile

          array.Sort(array, New MyArrayComparer())

          für "array.Sort" die Meldung:

          Zugriff des freigegebenen Members, konstanten Members, Enumerationsmembers oder geschachtelten Typs über eine Instanz; der qualifizierende Ausdruck wird nicht ausgewertet.
          C:\Dokumente und Einstellungen\Fd\Lokale Einstellungen\Anwendungsdaten\Temporary Projects\ConsoleApplication1\Module1.vb
          Zeile 24
          Spalte13
          Projekt :ConsoleApplication1

          Ich habe aber auch das, was bei mir beim Öffnen einer Konsolenwendung automatisch erscheint, nämlich:

          Module Module1
          Main()

          ..........ANWENDUNG..........

          End Sub

          End Module


          alles gelöscht und durch Deinen Code ersetzt.

          Fällt Dir dazu etwas ein?

          vG

          fredyx

          Comment


          • #6
            Hi fredyx,

            ich hab den Code ursprünglich fix für die zweite Spalte programmiert und gepostet. Danach fiel mir ein ich könnte die Wahl der Spalte mit einer Eigenschaft ergänzen und hab dann den Code im Post nur teilweise aktualisiert. Die Zeile
            Code:
            Array.Sort(array, myArrayComparer ())  ' Objekt das vergleicht
            hab ich jetzt korrigiert.

            Ich persönliche entwickle mit C# und da wird dies sauber kompiliert, also ohne Fehler und Meldungen. Danach übersetze ich den Code mit #Develop nach VB.net und kompiliere erneut.

            Die Meldung ist kein Fehler sondern ein Hinweis. Da ich in VB.net kein Experte bin weiß ich nicht woher dies stammt bzw. wie dies zu ändern ist dass es nicht mehr erscheint.

            Der Code funktioniert jedenfalls auch in VB.net so wie er soll.

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              jetzt meldet sich VB für my ArrayComparer mit:

              Fehler 2
              Die Klasse "ConsoleApplication1.ConsoleApplication2.MyArrayCo mparer" kann nicht indiziert werden, da sie keine Standardeigenschaft hat
              C:\Dokumente und Einstellungen\Fd\Lokale Einstellungen\Anwendungsdaten\Temporary Projects\ConsoleApplication1\Module1.vb 24 31 ConsoleApplication1


              ???

              vG

              fredyx

              Comment


              • #8
                Im Anhang die Projekte (C# und VB.net) - beide funktionieren (bei mir).

                mfG Gü
                Attached Files
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment


                • #9
                  Hallo gfoidl,

                  wenn ich die Version ohne "converted" öffne, dann kommt sofort beim Öffnen die Meldung: wie in Aus der Anlage Fehler1.jpg zu sehen.

                  Das Programm öffnet dann zwar, aber beim Start passiert dasselbe, wie ich es heute um 12:13 Uhr schon beschrieben hatte.

                  Wenn ich die "converted"- Version öffne, dann kommt zwar die Meldung beim Öffnen nicht, Nach dem Start verhält es sich aber genau so.

                  vG

                  fredyx
                  Attached Files

                  Comment


                  • #10
                    Hi,
                    1. öffne dein Entwicklungswerkzeug
                    2. gehe auf Projekt öffnen
                    3. navigiere zum Speicherort des Projekts
                    4. OK


                    Es könnte sein dass du die Express-Version verwendest. Beim Öffnen des Projekts aus dem Explorer wird versucht Visual Studio (als Vollversion) zu starten und somit erscheint dein Fehler.

                    Der Code ist korrekt und kompiliert. Bei der VB.net-Version erscheint allerdings eine Warnmeldung jedoch liefert die Ausführung das richtige Ergebnis.

                    mfG Gü
                    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                    Comment


                    • #11
                      Wenn ich die Warnmeldung hinnehme, dann funktioniert's.

                      Jetzt muss ich nur mal sehen, ob und wie ich das in meinem eigentlichen Programm umsetzen kann.

                      Zunächst noch mal danke.

                      vG

                      fredyx

                      Comment


                      • #12
                        Hallo gfoidl,

                        in meinem Programm kommt nach dem Start die Meldung:

                        "Das Objekt des Typs Testprogramm.MyArrayComparer kann nicht in Typ System.Collections.IComparer umgewandelt werden."
                        und zwar an der Stelle:

                        Matrix.Sort(Matrix, myArrayComparer)

                        Als Ausgabefeld habe ich eine Matrix von 4 x 5 Textfeldern.

                        Der Code ist in der Anlage CODE.PDF

                        Das Programm heißt "Testprogramm"

                        Da ich das Ganze nicht so richtig verstehe, kann ich leider nur immer dumm fragen, so dass ich doch immer wieder was dazu lerne.

                        Fällt Dir dazu noch was ein??

                        vG

                        fredyx

                        Comment


                        • #13
                          Wo ist der Anhang?

                          Bitte anhängen.

                          mfG Gü
                          "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                          Comment


                          • #14
                            Oh ja, vergessen!!
                            Attached Files

                            Comment


                            • #15
                              Hi,

                              sortiert wird über die statische Methode Sort der Array-Klasse.

                              D.h. im Code muss stehen
                              Code:
                              Array.Sort(...)
                              So wie in meinen Beispielen dargestellt, wie die Hilfe zu Sort liefert, ...

                              mfG Gü
                              "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                              Comment

                              Working...
                              X