arrays zusammenkopieren

  • VB.NET
  • .NET (FX) 4.0

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    arrays zusammenkopieren

    Hallo,

    ich habe folgenden Code:

    VB.NET-Quellcode

    1. Dim Queries As New List(Of IEnumerable(Of Object()))
    2. [...Queries(0) und Queries(1) werden mit Daten versorgt...]
    3. Dim ResultQuery As IEnumerable(Of Object()) = Nothing
    4. ResultQuery = Queries(0).Join(Queries(1), Function(Table1) Table1(0), Function(Table2) Table2(0), Function(Table1, Table2) Table1)


    Nun möchte ich als Ergebnis nicht nur Table1 haben, sondern auch Table2 daneben.

    Also wenn Table1 enthält: 'field1', 'field2' und Table2 enthält 'field3', 'field4', dann möchte ich am Ende eine Auflistung haben (ResultQuery), wo die Elemente so aussehen: 'field1', 'field2', 'field3', 'field4'.

    Wie ist das möglich?

    vb_fan schrieb:

    Wie ist das möglich?
    Hast Du mal dies probiert:

    VB.NET-Quellcode

    1. Queries.AddRange(Table1)
    2. Queries.AddRange(Table2)
    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 moechte die Daten nicht untereinander haben, sondern nebeneinander. Queries(0) enthaelt Daten und Queries(1) enthaelt Daten. Ich joine diese zwei und moechte die Daten sowohl aus Queries(0) als auch aus Queries(1). Mit dem obigen Code bekomme ich die Daten aus Queries(0) (Table1). Nun moechte ich auch die Daten aus Queries(1) (Table2) haben. Wie bei einem normalen Join: einige Felder aus Table1 und einige Felder aus Table2.

    Ich hoffe, mein Ziel so klarer vorgestellt zu haben.
    Das ist eher ein schlechtes Beispiel.

    Queries(0) ist eine Auflistung von Object(), sie enthält z. B. folgende Daten:

    muster0, sample0
    muster1, sample1
    mustern, samplen

    Also Queries(0) enthält 3 Items (3 Zeilen).

    Queries(1) enthält z. B. folgende Daten:

    muster0, table0
    muster1, table1
    mustern, tablen

    Die zwei Queries werden gejoint (gemeinsames Feld o. Wert ist muster0-mustern) und Folgendes kommt raus:

    muster0, sample0, muster0, table0
    muster1, sample1, muster1, table1
    mustern, samplen, mustern, tablen

    Also weiterhin 3 Zeilen, nur ergänzt mit den Daten aus Queries(1), ganz wie bei einem normalen Join in SQL.

    Mit dem obigen Code kommt nur das hier raus:

    muster0, sample0
    muster1, sample1
    mustern, samplen

    Also nur die Records aus Queries(0), wo es eine Übereinstimmung mit Queries(1) gibt (hier alle Records, da alle übereinstimmen).

    Und zu diesem Ergebnis möchte ich nun muster0, table0, etc.

    RushDen schrieb:

    wie wärs wenn du klassen oder strukturen nutzt anstatt zig auflistungen von auflistungen zu erstellen


    Alles hat seinen Grund.

    Übrigens, ich habe jetzt eine Lösung gefunden:

    VB.NET-Quellcode

    1. Dim rq = Queries(0).Join(Queries(1), Function(Table1) Table1(0), Function(Table2) Table2(0), Function(Table1, Table2) New With {Table1, Table2})
    2. For Each item In rq
    3. Array.Resize(item.Table1, item.Table1.Length + item.Table2.Length)
    4. Array.ConstrainedCopy(item.Table2, 0, item.Table1, item.Table1.Count - item.Table2.Count, item.Table2.Count)
    5. _OutputDataTable.Rows.Add(item.Table1)
    6. Next


    Diese Lösung hatte ich auch scon gestern probiert (hier meine ich den Teil mit

    VB.NET-Quellcode

    1. New With {Table1, Table2}
    , aber gestern konnte ich damit noch nicht viel anfangen.
    probier auchma so:

    VB.NET-Quellcode

    1. Dim rq = From Table1 In Queries(0) Join Table2 In Queries(1) On Table1(0) Equals Table2(0) Select Table1.Concat(Table2).ToArray
    2. For Each items In rq
    3. _OutputDataTable.Rows.Add(items)
    4. Next
    Aber der gemeinsame Schlüssel wird so pro Zeile doppelt ausgegeben, vlt. wär besser, ihn zumindest in Table2 zu überspringen

    VB.NET-Quellcode

    1. Dim rq = From Table1 In Queries(0) Join Table2 In Queries(1) On Table1(0) Equals Table2(0) Select Table1.Concat(Table2.Skip(1)).ToArray
    2. For Each items In rq
    3. _OutputDataTable.Rows.Add(items)
    4. Next
    vlt. fragst du dich, warum ich erst im Nachhinein damit ankomme, halt weil ich nix zum Testen hatte, post#6 schien dir ja des Ignorierens für würdig.
    Dank deiner Lösung liegt nun was vor, was in Linq-Syntax überführbar ist.
    Wirklich getestet natürlich immer noch nicht.



    Jo, alles hat seinen Grund, auch dass du die Frage danach so abspeist hat seinen Grund - da kann man nu mutmaßen...

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

    Ich habe deine Post nicht ignoriert, nur ein Beispiel zu coden, wäre zu umständlich gewesen, deshalb habe ich nach einer anderen Lösung gesucht. Ja, ich hätte das in meiner letzten Post schreiben können.

    Übrigens habe ich Concat ausprobiert, aber concat fügt die Elemente hintereinander (also nach unten) zusammen.
    hast du auch alle 4 Zeilen ausprobiert, die ich schrieb, und nicht nur Concat?

    wenn ja, tut mir leid, dann stimmt meine Übertragung wohl nicht - wie gesagt: kann ja nix testen.

    jdfs das hier

    VB.NET-Quellcode

    1. Array.Resize(item.Table1, item.Table1.Length + item.Table2.Length)
    2. Array.ConstrainedCopy(item.Table2, 0, item.Table1, item.Table1.Count - item.Table2.Count, item.Table2.Count)
    3. _OutputDataTable.Rows.Add(item.Table1)
    sieht mir doch genau danach aus, dass alles untereinander in Table1 geschrieben wird, welche dann zur Ausgabe kommt.
    Concat sollte da eiglich nix anneres machen.

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