Announcement

Collapse
No announcement yet.

Einträge in Array neu anordnen

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

  • Einträge in Array neu anordnen

    Hallo liebe Entwicklergemeinde,

    ich suche einen Denkanstoß wie ich folgende Aufgabe lösen kann:

    Ausgangssituation:
    Ich lese einen Multistring (REG_MULTI_SZ) aus der Registrierung folgendermaßen aus:

    [highlight=vbnet]
    Const machineRoot As String = "HKEY_LOCAL_MACHINE"
    Const subkey As String = "SYSTEM\CurrentControlSet\Services\Tcpip\Linka ge"
    Const keyName As String = machineRoot & "\" & subkey


    Dim tArray() As String = Registry.GetValue(keyName, "Bind", New String() {"Default if TestArray does not exist."})
    For i As Integer = 0 To tArray.Length - 1
    Console.WriteLine("TestArray({0}): {1}", i, tArray(i))
    Next
    Console.ReadKey()
    [/highlight]

    Zur Kontrolle gebe ich die Array-Einträge auf der Console aus.
    Die Einträge werden auch korrekt gelesen, folgendermaßen sieht es an meinem aktuellen PC aus:

    Code:
    TestArray(0): \Device\{20BD2E64-8B68-4525-9233-2C3094B090EE}
    TestArray(1): \Device\{D3B1F08F-AD23-41AA-9C74-307C8E079300}
    TestArray(2): \Device\{E26CA3A5-B746-4EB5-9685-E53F85963138}
    TestArray(3): \Device\{EDF3232D-6132-49CB-BB5D-AF088CC73847}
    TestArray(4): \Device\NdisWanIp
    Ziel:
    Letztendliches Ziel ist es das Array zu lesen, den Eintrag
    Code:
    \Device\NdisWanIp
    an die erste Stelle zu setzen, die restlichen Einträge in beliebiger Reihenfolge dahinter zu setzen und dieses Array dann als REG_MULTI_SZ wieder in die Registrierung zu schreiben.

    Frage:
    Grundsätzlich wird wohl das kopieren der Einträge in ein neues Array die Lösung darstellen, ich habe nur beim besten Willen keinen Ansatz wie ich das Array so durchsuche das im neuen Array als erstes der Eintrag
    Code:
    \Device\NdisWanIp
    und dann beliebige andere stehen.

    Der Eintrag
    Code:
    \Device\NdisWanIp
    steht zu Anfang nämlich nicht zwangsläufig an letzter Stelle sondern ist einfach irgendeiner der Einträge des Multistrings in der Registry.

    Ich wäre uch für jeden Denkanstoß dankbar!

    Liebe Grüße
    Rolf

  • #2
    Hallo Rolf

    folgender Link sollte weiterhelfen
    http://msdn.microsoft.com/de-de/libr...dd(VS.80).aspx

    oder mit findIndex
    http://msdn.microsoft.com/de-de/libr...we(VS.80).aspx

    Den Index von NdisWanIp ermitteln und den Inhalt von Array(0) mit Array(ermitteltenIndex) tauschen.
    Zuletzt editiert von gini; 07.12.2010, 12:42. Reason: Ergänzung
    Gruß Gini

    Win XP, Visual Studio 2008 Prof., SQL Server 2005 Express

    Comment


    • #3
      Hi gini,

      danke schonmal für deine Antwort...ich schau mir die Links später mal genauer an, momentan ist es hier etwas stressig :-)

      Ein erster Blick sah aber schon sehr vielversprechend aus.

      Comment


      • #4
        Hi gini,

        vielen Dank für deine Info's, das sortieren des Arrays über FindIndex klappt super.
        Für alle die das auch mal suchen hier der funktionierende Quellcode mit einer Ausgabe vorher/nachher auf der Console:

        [highlight=vbnet]
        Imports Microsoft.Win32

        Module Module1

        Sub Main()

        ' Konstanten für Registryzugriff deklarieren
        Const machineRoot As String = "HKEY_LOCAL_MACHINE"
        Const subkey As String = "SYSTEM\CurrentControlSet\Services\Tcpip\Linka ge"
        Const keyName As String = machineRoot & "\" & subkey

        ' Einträge aus "Bind" auslesen (REG_MULTI_SZ)...
        Dim keyArray() As String = Registry.GetValue(keyName, "Bind", New String() {"Schlüssel existiert nicht."})
        ' ...und den Index von \Device\NdisWanIp im Array ermitteln.
        Dim indexNDIS As Integer = Array.FindIndex(keyArray, AddressOf EndsWithNdiswanip)
        Dim tempString As String = ""

        Console.WriteLine("Alte Reihenfolge")

        For Each oldElement As String In keyArray
        Console.WriteLine(oldElement)
        Next

        ' Array neu sortieren
        tempString = keyArray(0)
        keyArray(0) = keyArray(indexNDIS)
        keyArray(indexNDIS) = tempString
        Console.WriteLine()
        Console.WriteLine("Neue Reihenfolge:")

        For Each newElement As String In keyArray
        Console.WriteLine(newElement)
        Next

        Console.ReadKey()

        End Sub

        Private Function EndsWithNdiswanip(ByVal s As String) As Boolean

        ' Stringlänge kontrollieren und auf die letzten 9 Zeichen prüfen
        ' Der String wird Lowercase konvertiert um Fehlern vorzubugen
        If (s.Length > 5) AndAlso (s.Substring(s.Length - 9).ToLower() = "ndiswanip") Then
        Return True
        Else
        Return False
        End If
        End Function

        End Module
        [/highlight]

        Da ich mich in VB noch relativ unsicher bewege bin ich für jeden Verbesserungsvorschlag am Code offen, sei er technischer oder kosmetischer Natur.

        Jetzt fehlt nur noch das zurückschreiben in die Registry, aber das sollte nicht allzu problematisch sein.

        Vielen lieben Dank für deine Hilfe!

        LG
        Rolf

        Comment


        • #5
          Mal ne kleine Frage. Eigentlich wäre das doch ganz einfach, weil eine Sortierung eigentlich schon zu viel verlangt ist. Schau einfach ob Dein Eintrag drin steht. Wenn ja mach ein neues Array auf, hau den gewünschten Eintrage an die erste Position und füge den Rest einfach hinten an. Das ist doch viel einfacher als irgendwas um zu sortieren oder so...

          Comment


          • #6
            Ähhh, ein einfaches swap von Elementen hätte es auch getan
            Christian

            Comment


            • #7
              Ähhh, ein einfaches swap von Elementen hätte es auch getan
              Nicht hätte sondern hat.

              Comment


              • #8
                Originally posted by Christian Marquardt View Post
                Ähhh, ein einfaches swap von Elementen hätte es auch getan
                Ist das nicht genau das was ich getan habe oder gibt es etwas in der Form Array.Swap(array, indexA, indexB)?

                Comment


                • #9
                  gibt es etwas in der Form Array.Swap(array, indexA, indexB)?
                  Nö, du könntest dir aber einfach eine entsprechende Extension Methode schreiben.

                  [Highlight=VB.Net]Module ExtensionMethods
                  <Extension()> _
                  Public Sub Swap(Of T)(ByVal array As T(), ByVal index1 As Integer, ByVal index2 As Integer)
                  Dim temp As T = array(index1)
                  array(index1) = array(index2)
                  array(index2) = temp
                  End Sub
                  End Module

                  'Usage
                  Dim mystrings() As String = {"A", "B", "C", "D", "E"}
                  mystrings.Swap(4, 1)
                  'Ergebnis {"A", "E", "C", "D", "B"}[/Highlight]

                  Comment

                  Working...
                  X