Alternative zu IsArray

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Haudruferzappeltnoch.

    Alternative zu IsArray

    Hallo,

    ich muss ein Object darauf prüfen, ob es ein Array ist.
    Information.IsArray kommt da bei google raus.

    Ich weiß mit TryCast kann man Obejcts prüfen, aber wie gebe ich da ein Array an?

    Eigentlich reicht mir das prüfen nicht, ich muss es dann auch irgendwie in ein Array verwandeln.

    Viele Grüße

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Musst Du es in ein typisiertes Array umwandeln, also String() oder Foo() oder so?

    VB.NET-Quellcode

    1. Dim Foo = {"1", "s"}
    2. Dim TypeOfFoo = Foo.GetType.ToString
    3. Dim Bar As Object = Foo
    4. Dim TypeOfBar = Bar.GetType.ToString
    5. Dim Foo2 = TryCast(Bar, String())
    6. Dim TypeOfFoo2 = Foo2.GetType.ToString

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Es können verschiedene Arrays sein, das ist das Problem. Nur ein paar also ich könnte wohl alle Möglichkeiten versuchen.
    TryCast(Bar, Array) klingt an sich passend.
    Aber bei Dim Baz = Foo2(0) meckert er über spätes Binden, was für mich auch nachvollziehbar ist, ich sage ihm ja nicht den Typ der Elemente.

    VB.NET-Quellcode

    1. ​Dim Foo2 = TryCast(Foo, String())
    2. If Foo2 is Nothing Then Foo2 = TryCast(Foo, Integer())
    3. If Foo2 is Nothing Then Foo2 = TryCast(Foo, Double())
    Dann erklär doch mal, welche Situation Dich dazu treibt, sowas durchführen zu müssen. Vielleicht kann man das Grundsatzproblem ja elegant anders lösen. Bin gerade zu unkreativ, um mir einen solchen Fall dafür zu überlegen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    Es können verschiedene Arrays sein
    Dann solltest Du immer den Type abfragen:

    VB.NET-Quellcode

    1. Dim flag1 = TypeOf (Foo2) Is String()
    2. Dim flag2 = TypeOf (Foo2) Is Object()
    3. Label1.Text = flag1.ToString()
    4. Label2.Text = flag2.ToString()
    Und:
    Wo kommen denn diese Arrays her?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich fülle einen Text mit Parametern aus.
    Die Parameterwerte an sich kommen aus verschiedenen Datenbankabfragen.

    Das will ich einheitlich gestalten.

    VB.NET-Quellcode

    1. Dim var1 as Integer
    2. Dim var2 as String
    3. Dim var3 as Integer()
    4. ...

    Ich kann zum Beispiel die Variablennamen gleich mit abfragen, das würde mir normalerweise nicht helfen, wenn ich alle Werte als separate Variablen anlege.
    Aber eine Variable ist ja auch nicht viel anders als eine Verbindung zwischen String und Wert, daher kann ich die Parameter als Dictionary zusammenfassen

    VB.NET-Quellcode

    1. Dim Parameter as New Dictionary(Of String, Object) From {
    2. {"var1", Nothing},
    3. {"var2", Nothing},
    4. {"var3", Nothing}...}

    Jetzt kann ich die Werte einheitlich aufrufen mit Parameter(Variablenname) und was sonst eine Zeile pro Einfügung ist, ist nun nur noch eine Zeile als Schleife verpackt.
    Und ich muss vor allem nicht mehr die Variable aussuchen, das macht das Dictionary selbstständig.

    Wenn diese Typisierung nicht so zerfallen würde wäre das echt eine Bombenlösung die mir gut und gerne 100 Zeilen Code spart.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    Die Parameterwerte an sich kommen aus verschiedenen Datenbankabfragen.
    Da sind Dir doch die Typen vollständig bekannt?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich verstehe folgendes: Du willst einen variablen Text erstellen, also eine String-Variable. Einzelne Textbausteine sind Werte aus einer Datenbank. Diese werden abgefragt und in Dein Dictionary reingesteckt. Und dann erstellst Du den Text durch Zugriff auf das Dictionary. Stimmt das so? Wenn ja, welche Datentypen kommen vor und was soll im Text mit einem Double-Array passieren?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    guck dir mal diesen kranken Scheiss an:

    VB.NET-Quellcode

    1. Private Function Object2Dictionary(itm As Object) As Dictionary(Of String, Object)
    2. Dim s = Newtonsoft.Json.JsonConvert.SerializeObject(itm)
    3. Return Newtonsoft.Json.JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(s)
    4. End Function
    5. <STAThread>
    6. Public Sub Main(args As String())
    7. Dim dings = New With {.var1 = 5, .var2 = "humpf", .var3 = {2, 3, 4}}
    8. Dim dingsDic = Object2Dictionary(dings)
    9. Dim jArr = DirectCast(dingsDic("var3"), Newtonsoft.Json.Linq.JArray)
    10. Dim arr = jArr.Select(Function(x) CInt(x)).ToArray
    das verwandelt ein komplexes Objekt (dings)so gut es kann in ein Dictionary.
    Weil Json-Serialisierung kann komplexe Objekte immer auch als Dictionary deserialisieren
    Ja, dadurch bekommst Du ein Integer-Array. Aber doch nur, weil Du in Zeile#11 mit CInt den Typ vorgibst. Was ist damit gewonnen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    jo, ich hab das Problem vlt. nicht ganz verstanden. Vielleicht will er ja alles nach String, konvertieren, das könnte so gehen:

    VB.NET-Quellcode

    1. Private Function Object2Dictionary(itm As Object) As Dictionary(Of String, Object)
    2. Dim s = Newtonsoft.Json.JsonConvert.SerializeObject(itm)
    3. Return Newtonsoft.Json.JsonConvert.DeserializeObject(Of Dictionary(Of String, Object))(s)
    4. End Function
    5. <STAThread>
    6. Public Sub Main(args As String())
    7. Dim dings = New With {.var1 = 5, .var2 = "humpf", .var3 = {2, 3, 4}}
    8. Dim dingsDic = Object2Dictionary(dings)
    9. Dim jArr = DirectCast(dingsDic("var3"), Newtonsoft.Json.Linq.JArray)
    10. Dim arr = jArr.Select(Function(x) CStr(x)).ToArray
    Ok, ich weiß jetzt was ich besser erklären sollte.^^

    An sich die Nicht-Array Werte sind einfach. Weil die können ruhig Object sein, mit ToString krieg ich ja trotzdem was ich brauche.
    Ich habe eine Zeile
    "Das ist ein Text mit einem #platzhalter#" und dazu habe ich platzhalter als Variablename in dieser Zeile, beides ist in der Datenbank.
    Ich habe also eine Liste Zeilen und eine Liste Variablennamen.
    Jetzt muss ich nur alle Zeilen "befüllen".

    VB.NET-Quellcode

    1. Dim Text as New StringBuilder
    2. For i = 0 To Textzeilen.Count - 1
    3. Text.AppendLine(Textzeilen(i).Replace($"#{Variablennamen(i)}#", $"{var}"))
    4. Next

    Für Arrays muss es eher so gehen: (die Zeile wird mehrfach verwendet)

    VB.NET-Quellcode

    1. Dim Text as New StringBuilder
    2. For i = 0 To Textzeilen.Count - 1
    3. For each var in Parameter(Variablennamen(i)) 'geht nicht weil Object (Parameter ist das Dictionary aus Post 7)
    4. Text.AppendLine(Textzeilen(i).Replace($"#{Variablennamen(i)}#", $"{var}"))
    5. Next
    6. Next

    Das heißt ich müsste also zwei Fälle unterscheiden Array und Nicht-Array.

    Also ja bekannt sind die Typen an sich, aber ich darf die Variablen nicht alle einzeln ansprechen. Da muss was drüber stehen was das automatisch verteilt. Ich hab ein Dicitionary genommen, vielleicht macht das ja nicht so viel Sinn.
    Angenommen da steht "Es ist #Uhrzeit#" und ich möchte nicht mehr die Uhrzeit einsetzen, sondern was ich zum Frühstück hatte. Dann möchte ich entsprechend in der Datenbank nur die Zeile ändern. Nicht den Programmcode.

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Ich verstehe nicht ganz, das Dictionary hab ich doch schon. Und die Werte in String umwandeln hilft leider auch nicht, dann wird ein Array nämlich auch zu einem String, das heißt nicht mehr mehrere Elemente.

    Ok das von Json erzeugte Dictionary ist gar kein echtes String, Object Dictionary. Deswegen macht mein Dictionary eine Fehlermeldung und deins nicht. Da sind die Objects quasi alle Strings

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Ok, Du hast also in Deiner DB Textzeilen mit Platzhaltern/Variablennamen und die Variablen mit deren Namen und deren Werte. Trotzdem bleibt meine Frage unbeantwortet:

    VaporiZed schrieb:

    was soll im Text mit einem Double-Array passieren?
    Denn: Wenn Du ein Integer-Array hast, musst Du ja auch einen Index angeben, damit Du einen Integerwert aus dem Array bekommst. Oder sollen bei Verwendung eines Arrays alle Werte angezeigt werden? Dann stellt sich auch die Frage: Wie werden diese Einzelwerte dann zusammengefügt? neue Zeile? Semikolon? Plus?
    Ein Beispiel: Ich hatte heute zum Frühstück #Frühstückszeilen#; Frühstückszeilen = {"Toast", "Spiegelei", "5 kg Nuss-Nougatcreme"}. Wie soll der fertige Text lauten?

    Quellcode

    1. Ich hatte heute zum Frühstück Toast, Spiegelei, 5 kg Nuss-Nougatcreme

    Quellcode

    1. Ich hatte heute zum Frühstück Toast
    2. Spiegelei
    3. 5 kg Nuss-Nougatcreme

    Quellcode

    1. Ich hatte heute zum Frühstück Toast+Spiegelei+5 kg Nuss-Nougatcreme


    Was ist bei einem Zahlenarray?
    Ein Beispiel: Ich hatte heute folgende Temperaturen gemessen: #Temperaturwerte#, Temperaturwerte = {12.3, 15.6, 23.9}. Wie soll der fertige Text lauten?

    Quellcode

    1. Ich hatte heute folgende Temperaturen gemessen: 12.3, 15.6, 23.9

    Quellcode

    1. Ich hatte heute folgende Temperaturen gemessen: 12.3 °C + 15.6 °C +23.9 °C

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Doch das hatte ich geschrieben die Zeilen werden mehrfach geschrieben und das Array durchlaufen.
    Ich hatte heute folgende Temperaturen gemessen: #Temperaturwerte#
    Wird zu
    Ich hatte heute folgende Temperaturen gemessen: 12.3
    Ich hatte heute folgende Temperaturen gemessen: 15.6
    Ich hatte heute folgende Temperaturen gemessen: 23.9

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Haudruferzappeltnoch schrieb:

    Doch das hatte ich geschrieben die Zeilen werden mehrfach geschrieben und das Array durchlaufen.
    Ah, den Satz hatte ich inhaltlich ganz anders interpretiert.

    Du meinst dann also sowas:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Dictionary As New Dictionary(Of String, Object) From {
    3. {"Var1", 1},
    4. {"Var2", "2"},
    5. {"Var3", {3.3, 4.4}},
    6. {"Var4", {5, 6}}}
    7. For Each Entry In Dictionary
    8. ShowEntry(Entry)
    9. Next
    10. End Sub
    11. Private Sub ShowEntry(Entry As KeyValuePair(Of String, Object))
    12. If Entry.Value.GetType.IsArray Then
    13. Dim Array = DirectCast(Entry.Value, Array)
    14. For i = 0 To Array.Length - 1
    15. ShowEntry(New KeyValuePair(Of String, Object)(Entry.Key & $"({i})", Array.GetValue(i)))
    16. Next
    17. Else
    18. MessageBox.Show($"{Entry.Key}: {Entry.Value}")
    19. End If
    20. End Sub


    ##########

    @Haudruferzappeltnoch: Und damit ich endlich auch mal was mit dem Iterator-Kram erstellt habe:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim Dictionary As New Dictionary(Of String, Object) From {
    3. {"Var1", 1},
    4. {"Var2", "2"},
    5. {"Var3", {3.3, 4.4}},
    6. {"Var4", {5, 6}}}
    7. For Each Entry In GetEntryDescriptionsIn(Dictionary)
    8. MessageBox.Show(Entry)
    9. Next
    10. End Sub
    11. Private Iterator Function GetEntryDescriptionsIn(Dictionary As Dictionary(Of String, Object)) As IEnumerable(Of String)
    12. For Each Entry In Dictionary
    13. If Entry.Value.GetType.IsArray Then
    14. Dim Array = DirectCast(Entry.Value, Array)
    15. For i = 0 To Array.Length - 1
    16. Yield $"{Entry.Key}({i}): {Array.GetValue(i)}"
    17. Next
    18. Else
    19. Yield $"{Entry.Key}: {Entry.Value}"
    20. End If
    21. Next
    22. End Function

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Array.GetValue das war der letzte Kniff, den ich hätte finden müssen. Es gibt doch immer eine Methode die man nicht ausschreiben muss wie zum Beispiel SqlDataReader.Item(i) = SqlDataReader(i)
    Ich habe angenommen das wäre bei Array auch der Fall.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()