none
Suchen in mehrdimensionalem Array RRS feed

  • Frage

  • Hi.

    Ich stehe gerade etwas auf dem Schlauch, vielleicht könnt ihr mir helfen.

    Folgender Hintergrund (stark vereinfacht):

    Ich habe eine Structure definiert:

      Friend Structure Info
        Dim intID As Integer
        Dim strLog As String
      End Structure

    Damit habe ich ein Array erstellt und gefüllt:

    Friend ary1() As Info
    ...
    ReDim ary1(5)
    ...
    For i=0 to 5
      ary1(i).intID= "<eindeutige zahl>"
      ary1(i).strLog = "<beliebiger Text>"
    next

    Ergebnis ist eine Matrix mit einer eindeutigen ID und einem dazugehörigen Text. Im "echten" Projekt sind es natürlich mehr Eigenschaften. Die Daten kommen ursprünglich aus einer Oracle-Datenbank, werden etwas bearbeitet und im dann beim Programmstart nur ein paar Mal ausgelesen.

    Was ich irgendwie nicht schaffe: Aus dem Array den Text zu einer bestimmten ID finden.

    ...= Array.IndexOf(...) ?

    ary1.FindIndex(...)?

    ...?

    Vermutlich bin ich irgendwie betriebsblind, vielleicht kann mich ja jemand mit 1-2 Zeilen auf die richtige Spur schubsen...

    Oder ist Structure für den Zweck ungeeignet? Ein Konstrukt aus DataTable oder so erscheint mir etwas Overkill...

    Danke!

    BjH

    Freitag, 14. September 2012 15:14

Antworten

  • Hallo Björn,

    etwas betriebsblind könnte schon sein , denn .NET hat seit längerem alles an Bord was man braucht.
    Nebenbei ist das was Du da oben zeigst ein eindimensionales Array.

    Verwende eine Klasse (ein Struktur macht hier nur Ärger) und eine List(T).

    Dann kannst Du etwas verwenden wie:

            Dim infoList As New List(Of Info) From
            {
                New Info() With {.Id = 1, .Log = "Log 1"},
                New Info() With {.Id = 2, .Log = "Log 2"}
            }
            For index = 3 To 10
                infoList.Add(New Info() With {.Id = index, .Log = "Log " + index.ToString()})
            Next
    
            Dim id = 6
            Dim info6 = infoList.Find(Function(i) i.Id = id)
            Console.WriteLine(info6)
    
            Dim infolog8 = infoList.Find(Function(i) i.Log = "Log 8")
            Console.WriteLine(infolog8)

    was einige der neueren Konstrukte von Visual Basic wie Lambda-Ausdrücke und Auflistungsinitialisierer verwendet, generische Listen gibt es bereits seit VS 2005.

    LINQ geht damit dann auch,  wie es Dein Namensvetter zeigt.

    Wenn Du es aus einer (Oracle) Datenbank befüllen möchtest, so kannst Du einen DataReader verwenden und wie oben die Daten in die Auflistung einfügen.

    Gruß Elmar
    Freitag, 14. September 2012 19:20
    Beantworter

Alle Antworten

  • Hi Björn,

    über mit Ling .

    from inf in arr1 where (arr.ID = eingabeID) select inf.strLog

    Hab ich jetzt so runte geschrieben,  muss nicht Funktieren.

    Geht aber in die Richtung.

    MFG

    Björn

    Freitag, 14. September 2012 15:37
  • Hallo Björn,

    etwas betriebsblind könnte schon sein , denn .NET hat seit längerem alles an Bord was man braucht.
    Nebenbei ist das was Du da oben zeigst ein eindimensionales Array.

    Verwende eine Klasse (ein Struktur macht hier nur Ärger) und eine List(T).

    Dann kannst Du etwas verwenden wie:

            Dim infoList As New List(Of Info) From
            {
                New Info() With {.Id = 1, .Log = "Log 1"},
                New Info() With {.Id = 2, .Log = "Log 2"}
            }
            For index = 3 To 10
                infoList.Add(New Info() With {.Id = index, .Log = "Log " + index.ToString()})
            Next
    
            Dim id = 6
            Dim info6 = infoList.Find(Function(i) i.Id = id)
            Console.WriteLine(info6)
    
            Dim infolog8 = infoList.Find(Function(i) i.Log = "Log 8")
            Console.WriteLine(infolog8)

    was einige der neueren Konstrukte von Visual Basic wie Lambda-Ausdrücke und Auflistungsinitialisierer verwendet, generische Listen gibt es bereits seit VS 2005.

    LINQ geht damit dann auch,  wie es Dein Namensvetter zeigt.

    Wenn Du es aus einer (Oracle) Datenbank befüllen möchtest, so kannst Du einen DataReader verwenden und wie oben die Daten in die Auflistung einfügen.

    Gruß Elmar
    Freitag, 14. September 2012 19:20
    Beantworter
  • Du suchst ja nicht den Index sondern die ID.

    Es geht auch so. Beim Finden über das Suchen von anderen Eigenschaften ist die Frage wie viele Ergebnisse es geben kann. Und wie dann damit umzugehen ist.

    Public Class Form1

      Friend Structure Info
        Dim ID As Integer
        Dim Log As String
        Dim Log2 As String
        Dim Log3 As String
      End Structure

      Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim dictInfo As New Dictionary(Of Integer, Info)
        Dim sInfo As Info

        For ID As Integer = 1200 To 1210
          Dim InfoNew As New Info

          With InfoNew
            .ID = ID
            .Log = "Log" & ID.ToString
            .Log2 = "Log2" & ID.ToString
            .Log3 = "Log3" & ID.ToString
          End With

          dictInfo.Add(InfoNew.ID, InfoNew)
        Next

        sInfo = dictInfo(1204)
        MsgBox(sInfo.ID.ToString & ": " & sInfo.Log2)
      End Sub
    End Class




    • Bearbeitet Markus222 Freitag, 14. September 2012 22:49
    Freitag, 14. September 2012 21:09
  • Hallo Elmar,

    vielen Dank, funktioniert prima!

    Gruß, Björn

    P.S. Warum eindimensional? Wenn ich das gedanklilch auf Excel übertage habe ich doch "Zeilen" (0,1,2 ...) und "Spalten" (ID, Log, ...), das sind für mich 2 Dimensionen?!?

    Montag, 24. September 2012 06:50
  • Hallo Björn,

    auf Excel übertragen wäre das Zeile[0, 1] oder Zeile[0][1] - wobei Excel technisch mehr das zweite umsetzt.

    In beiden Fällen gibt es aber keine "ID", "Log" sondern nur eine Zelle, in der beliebiges drinstehen kann - eine Zahl  ebenso Text oder gar eine Grafik. Weswegen man die Analogie von Excel und Datenbank gedanklich meiden sollte.

    Wenn Du Dein Wissen aufpolieren möchtest, so schau Dir mal an Arrays in Visual Basic,
    dort findet Du eindimensionale, mehrdimensionale und verzweigte (jagged) Arrays.

    Faktisch setzt man jedoch für Datenbankabfragen auf typsichere Auflistungen, da sie die Verwaltung deutlich vereinfachen und bildet die Spalten der Tabelle / Abfrage auf einer Klasse ab.

    Gruß Elmar

    Montag, 24. September 2012 07:40
    Beantworter
  • Hi Björn,

    die Deklaration des Arrays ist Eindimensional (arr(5)) und nicht Zweidimensional (arr(5,5)).

    MFG

    Björn

    Montag, 24. September 2012 07:42