Benutzer mit den meisten Antworten
Suchen in mehrdimensionalem Array

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
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- Als Antwort markiert Björn Hennings Montag, 24. September 2012 06:43
Alle 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- Als Antwort markiert Björn Hennings Montag, 24. September 2012 06:43
-
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 StructurePrivate 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 InfoFor ID As Integer = 1200 To 1210
Dim InfoNew As New InfoWith InfoNew
.ID = ID
.Log = "Log" & ID.ToString
.Log2 = "Log2" & ID.ToString
.Log3 = "Log3" & ID.ToString
End WithdictInfo.Add(InfoNew.ID, InfoNew)
NextsInfo = dictInfo(1204)
MsgBox(sInfo.ID.ToString & ": " & sInfo.Log2)
End Sub
End Class
- Bearbeitet Markus222 Freitag, 14. September 2012 22:49
-
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