4 Listen mit .Join zusammenführen funktioniert nicht

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

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Sekki.

    4 Listen mit .Join zusammenführen funktioniert nicht

    Guten Tag,

    ich möchte 4 Listen zusammenführen. Ich habe folgenden Code:

    VB.NET-Quellcode

    1. ​Dim finishedInv As New List(Of String)
    2. finishedInv = finishedInv.Join(" | ", pList, vList, cList, p2List)


    Er soll von jeder Liste die erste Zeile nehmen, sie zusammenführen und mit einem " | " trennen. Dann die zweite Zeile. Dann die dritte usw.
    Er zeigt mir an, dass "join" falsch ist. Ich habe mich durch sämtliche Threads durchgeschlagen. Nutze ich das falsch?

    Das ist wahrscheinlich meine letzte Frage zu heute, ich habe genug von dem Thema mitgenommen. Ich nerve euch damit morgen weiter. Aber ich würde halt gerne nur noch das wissen, damit ich es beenden kann. Eigentlich ist doch alles richtig, oder?

    MFG
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Hi
    die Join-Funktion kenne ich nur von System.String.Join:

    VB.NET-Quellcode

    1. String.Join(" | ", pList.Concat(vList).Concat(cList).Concat(p2List))


    Mein Tipp: Setze dich mit den Fehlermeldungen auseinander und lerne, die Methoden von Objekten zu begreifen. Durch Extensions ist die Regel, dass alle Methoden auf Objekten definiert werden und man daher über den Objektbrowser oder dem Internet gut informiert wird, zwar etwas untergraben, aber dennoch zählt diese weiterhin. Visual Studio liefert einem außerdem ja, welche Methoden unterstützt werden.

    Viele Grüße
    ~blaze~
    Join ist ein Befehl, um mehrere (Einzel-)Strings zusammenzubasteln. Selbst wenn es ein Listenbefehl wäre, käme m.E. raus, dass alles von pList kommt, dann von vList, dann von cList und dann von p2List.
    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.
    @~blaze~
    Du hast mir direkt die Lösung vorgeschlagen, wonach ich gesucht habe. Concat. Ich dachte, dass gibt es nur in vb 2008.

    Nur ist das Problem folgendes: "Der Wert vom Typ "String" kann nicht in "List(Of String)" konvertiert werden."
    Hast du da eine Lösung?

    @VaporiZed
    Das heißt, ich kann Join nicht für Listen nutzen, oder?
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Es kommt nur ein einziger String dabei raus. Und der enthält alles, und zwar mit ~blaze~s abgewandeltem Concat-Befehl:

    VB.NET-Quellcode

    1. Dim finishedInv As String = Nothing
    2. Dim pList As New List(Of String)
    3. pList.AddRange({"1", "2", "3"})
    4. Dim vList As New List(Of String)
    5. vList.AddRange({"4", "5", "6"})
    6. Dim cList As New List(Of String)
    7. cList.AddRange({"7", "8", "9"})
    8. Dim p2List As New List(Of String)
    9. p2List.AddRange({"10", "11", "12"})
    10. finishedInv = String.Join(" | ", pList.Concat(vList).Concat(cList).Concat(p2List))

    => 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12
    Du scheinst aber zu wollen: {1 | 4 | 7 | 10}, {2 | 5 | 8 | 11}, ... richtig?
    Da wirst Du um nen Schleifencode wohl nicht vorbeikommen.

    EDIT: Da stellt sich aber die Frage, was passiert, wenn die Listen unterschiedlich lang sind.
    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.
    @VaporiZed

    Okay, vielleicht drücke ich mich doch mal besser aus.
    Meine Listen sind zu 100% gleich lang. Da besteht keinerlei Zweifel.

    @~blaze~

    Ich habe 4 Listen.

    Liste1:
    [Einträge]
    Hallo1
    Hallo2
    Hallo3
    Hallo4

    Liste2
    [Einträge]
    Hallo5
    Hallo6
    Hallo7
    Hallo8

    Liste3
    [Einträge]
    Hallo9
    Hallo10
    Hallo11
    Hallo12

    Liste4
    [Einträge]
    Hallo13
    Hallo14
    Hallo15
    Hallo16

    Der Output soll nun sein:

    Hallo1 | Hallo5 | Hallo9 | Hallo13
    Hallo2 | Hallo6 | Hallo10 | Hallo14
    Hallo3 | Hallo7 | Hallo11 | Hallo15
    Hallo4 | Hallo8 | Hallo12 | Hallo16

    Ich hoffe, dass dies mehr Einsicht in mein Vorhaben zeigt. Ich bin schon außer Puste, was das angeht.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Dann einfacher Schleifencode:

    VB.NET-Quellcode

    1. For i = 0 To pList.Count - 1
    2. finishedInv.Add(String.Join(" | ", pList(i), vList(i), cList(i), p2List(i)))
    3. Next

    wobei da natürlich wieder gilt: Dim finishedInv As New List(Of String)
    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.
    @VaporiZed
    Deine Methode hat wunderbar funktioniert! Auf sowas wäre ich einfach nie selbst gekommen. Ich bedanke mich!

    @~blaze~
    Auch bei dir bedanke ich mich für deine hilfreiche Arbeit, sonst wären wir vielleicht nicht auf Concat gekommen.
    Ich weiß, für das Bedanken gibt es den "Hilfreich!" Knopf, aber da kommt einfach nicht das rüber, was man gerne sagen möchte.

    Ich hoffe, dass man euch hier auch in Zukunft öfters sieht. :'3 Ich habe nun exakt das von Vapori genommen, weil es exakt dem entspricht, nach dem ich suche. Falls ihr noch wissen wollt, wozu ich das brauchte:

    Ich habe 4 Spalten aus einer Tabelle ausgelesen(MySQL). Die 2te Spalte bestand jedoch nur aus ID's, die musste ich in einer anderen Tabelle erneut suchen, um den Namen herauszufinden. Am Ende musste ich alle 3 Listen zusammenführen.

    MfG
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Wie meinst du das?
    Also, ist damit gemeint, dass es noch viel einfacher geht, als wie ich es gemacht habe? Würde mich nämlich mal interessieren.

    Edit:
    @VaporiZed
    Ich muss mich korrigieren. Irgendwas passt da nicht. Die Einträge stimmen nicht mit den ID's überein. Klatscht er die Listen wirklich aneinander?
    Und ist das wirklich richtig?

    VB.NET-Quellcode

    1. For i = 0 To invposList.Count - 1

    Was genau macht dieser Teil? Ich habe nun übrigens die Variablen etwas umgeschrieben, damit ich sie einfacher erkenne. Nicht wundern. Ach Mist, das verwirrt mich nun massiv..

    Edit:
    Nope, war richtig. Ich schaue mal, wo mein Fehler liegt.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Sekki“ ()

    Warte, bis der Debugger beim Stop-Befehl anhält und fahre mit dem Mauscursor über finishedInv => es kommt folgendes für den Inhalt von finishedInv raus:
    (0) "1 | 4 | 7 | 10"
    (1) "2 | 5 | 8 | 11"
    (2) "3 | 6 | 9 | 12"

    VB.NET-Quellcode

    1. Dim finishedInv As New List(Of String)
    2. Dim pList As New List(Of String)
    3. pList.AddRange({"1", "2", "3"})
    4. Dim vList As New List(Of String)
    5. vList.AddRange({"4", "5", "6"})
    6. Dim cList As New List(Of String)
    7. cList.AddRange({"7", "8", "9"})
    8. Dim p2List As New List(Of String)
    9. p2List.AddRange({"10", "11", "12"})
    10. For i = 0 To pList.Count - 1
    11. finishedInv.Add(String.Join(" | ", pList(i), vList(i), cList(i), p2List(i)))
    12. Next
    13. Stop


    Was macht die For-Schleife*:
    • Zähle i von 0 bis zum obersten Index von invpos. Da die Liste nullbasiert ist, wird eine Liste mit 5 Einträge Items mit den Indizes von 0 bis 4 enthalten => Count - 1 = 5 - 1 = 4 => zähle i von 0 bis 4
    • Füge dann den Eintrag i aus allen vier Listen zusammen und bilde damit einen neuen Eintrag in der Zielliste
    • dabei erhöht die Schleife nach jedem Durchlauf das i um 1, sodass die Zusammenfassung zu einem neuen String zuerst mit allen ListItems mit Index 0 gemacht wird (also dem jew. 1. Item einer Liste), dann mit dem 2. Item, dem 3., ...
    *bevor es For Each gab, war dies eine sehr typische For-Schleife; klingt fies, aber gehört zu den Programmiergrundlagen
    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.
    @VaporiZed
    Danke dir für die Information. Jetzt verstehe ich den Sinn. Ich bin bei "For" immer verwirrt.

    Jedenfalls glaube ich, dass ich das Problem gefunden habe.

    VB.NET-Quellcode

    1. For Each i In kompletteIdList
    2. For Each i2 In invIdList
    3. If i.Contains(i2 & " ") Then
    4. Dim Info As String = (i)
    5. Dim Split() As String = Info.Split(" ")
    6. Dim Value0 As String = Split(0) 'ID
    7. Dim Value1 As String = Split(1) 'NAME
    8. invnamesList.Add(Value1)
    9. End If
    10. Next
    11. Next


    Er soll jede Zeile aus kompletteIdList auslesen und mit jeder Zeile aus kompletteIdList abfragen, ob die Zeile mit der Zeile aus invIdList übereinstimmt. Wenn ja, soll er die Zahl und den Namen aus kompletteIdList splitten und in zwei Variablen tun.

    Macht man das so? For each in einer anderen For Each schleife verwirrt mich ziemlich.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.
    Blaze hat dir doch bereits das passende Stichwort genannt Sql Join, damit musst du das Rad nicht neu erfinden. Google mal danach und passe deinen SQL -Query dementsprechend an und die Datenbank liefert dir dein gewünschtes Ergebniss.

    Datenbank/Einführung in Joins

    Sekki schrieb:

    Ich habe 4 Spalten aus einer Tabelle ausgelesen(MySQL). Die 2te Spalte bestand jedoch nur aus ID's, die musste ich in einer anderen Tabelle erneut suchen, um den Namen herauszufinden. Am Ende musste ich alle 3 Listen zusammenführen.


    Führe die Daten bereits in der SQL Abfrage zusammen. Da musst du nicht mehr mit Listen zusammenführen und so rumwurschteln.

    Join per SQL ist hier die Magische Kraft, die das kann ;)
    @~blaze~ und @Fakiz haben dir das auch schon empfohlen. Wäre auch auslastungstechnisch die bessere Variante, da hier die Berechnung vom Server, nicht aber dem Client ausgeführt wird.

    Der Lösungsansatz vom netten Kollegen @VaporiZed wäre zwar nicht Falsch, ist jedoch unnötig kompliziert.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo: Die alte ich-hab-nen-Hammer-und-ich-sehe-tote-Nägel-Geschichte ... ;(
    Auch wenn die Info zum Thema SQL erst in Post#10 kam (oder hab ich was überlesen?), hätte ich wohl nicht anders geantwortet, da das Riesen-Thema SQL (gleich nach RegEx, und weit vor JumpLists ;) ) noch auf meiner irgendwann-mal-to-learn-list steht.
    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.
    Wenn sowas bereits in der SQL-Abfrage machbar ist, schneide ich mir meine Finger ab. Ich habe teilweise 4 Connections in einem Button. SQL Join hört sich interessant an, ich schau mir das mal an. Ich dachte, dass damit gemeint war, dass man die SQL Outputs joined, was ja mein Ziel ist. Aber anscheinend ist dies ja ein Begriff.

    Edit:
    Das ist so verdammt kompliziert. Macht SQL Join denn auch folgendes: Nimmt Spalte von aktueller Tabelle, liest den Spaltennamen auch in anderer Tabelle aus, nimmt von den Einträgen die Spalte daneben(Names) und gibt diese ab? Uff.. Das ist mir wieder zu hoch. xD Sollte ich damit lieber in den Datenbankprogrammierung Bereich?
    @mrMo

    Edit:
    Okay, anscheinend kann mal eine equivalente Suche machen. Ich melde mich wieder, wenn ich nicht weiterkomme!

    Edit:
    Das ist mir zuviel. Ich werde mich damit man spezifisch an die Datenbankprogrammierer wenden. Ich glaube, die können mir da etwas mehr helfen. Wenn ihr die Antwort dennoch wisst, zögert nicht.
    Wenn ich eine Frage stelle, habe ich sie bereits gegooglet. Ja, es kommt vor, dass ich die Antwort übersehe. Ja, es kommt vor, dass ich sie nicht verstehe. Deshalb bin ich hier. Wenn dies eure Frage war, dann antwortet bitte nicht. Es stiehlt sämtliche Motivation.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Sekki“ ()