Brauche eine erklärung für Code

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von Bernd.

    Brauche eine erklärung für Code

    Hallo zusammen,
    aus folgenden Text Zeilen, werden die Datei Namen inkl. Extension gefiltert.

    ********** 1 w00db033 w00db033 4328 Mar 12 2011 Anmeldung_Kurs.php
    ********** 1 w00db033 w00db033 7223 Mar 12 2011 BMI.php
    ********** 1 w00db033 w00db033 9974 Mar 12 2011 Beitraege.php

    mit dieser Zeile Code

    VB.NET-Quellcode

    1. Dim line As String = "********** 1 w00db033 w00db033 4328 Mar 12 2011 Anmeldung_Kurs.php"
    2. Dim fileName As String = fileNames.First(Function(f) line.EndsWith(f))


    Ich verstehe diese Zeile Code nicht.
    Wer könnte sie mir mal erklären ?
    Könnte mann mit dieser Art abfrage auch das Datum oder die Dateigröße da raus holen ?

    vielen dank
    Bernd

    Edit:

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

    .First ist eine Extension-Method, die aus einer Auflistung den ersten Wert zurückgibt.
    Alternativ kann eine Prüffunktion übergeben werden, damit ein Wert geliefert wird, der der Suchfunktion entspricht.
    Dies wird im Beispiel mit einer Inline-Funktion gelöst.
    Diese Inline-Funktion wird nur in dieser Zeile verwendet, braucht daher keinen Funktionsnamen. Der Parameter "suchwert" wird auch nur in der Inline-Func verwendet und kommt aus der filenames-Auflistung.
    Unten eine lesbarere Version, ...mehrzeilig, daher mit "end function".

    VB.NET-Quellcode

    1. Dim filename As String = fileNames.First(
    2. Function(suchwert)
    3. Return line.EndsWith(suchwert)
    4. End Function
    5. )


    Da dies - wie du siehst - im Prinzip eine normale Funktion ist, kannst du natürlich auch andere Werte rausfiltern.
    Evtl. kommst du mit LINQ auch zum Ziel.
    Hey Kurth,
    ne ist mir noch nicht klar.
    First:
    Gibt das erste Element in einer Sequenz zurück, das eine angegebene Bedingung erfüllt.
    Welche Bedungung ? woher kommt die denn ?

    Function(f)
    f ist nur ein String. den kann ich tauschen, nach belieben.
    f ist nur ein String ohne Inhalt. Function(f As String)

    line.EndsWith(f)
    wenn die Zeile aber mit einem (f), der ist ja leer, endet....

    Deine Erklärung ist gut, leider verstehe ich den Zusammenhang nicht .

    danke
    Bernd

    Edit:
    ich habe die Zeile mal mit "FindLast" geschreiben. Das Ergebnis ist aber das gleiche. Ehhhhhhh ?

    VB.NET-Quellcode

    1. Dim fileName As String = fileNames.FindLast(Function(r) line.EndsWith(r))

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

    Ich versteh Dich, Bernd.
    Ich hab mit Deiner Funktion ein wenig rumgespielt und hab nur Grütze rausbekommen. :S

    VB.NET-Quellcode

    1. Dim line As String = "********** 1 w00db033 w00db033 4328 Mar 12 2011 Anmeldung_Kurs.php"
    2. Dim ff As String = "php" ' oder was anderes
    3. Dim fileName As String = line.First(Function(f) line.EndsWith(ff))
    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!
    Danke @Rod

    RodFromGermany schrieb:

    hab nur Grütze rausbekommen.

    und genau deshalb komme ich nicht dahinter !?

    Ich habe die Daten dich ich Extrahieren möchte auf eine andere Weise geholt. Geht auch ohne Fehler und ohne aufwändiges und kompliziertes Regex.

    Ich willlllllllll aber trotzdem wissen woher diese Zeile den Filenamen bzw. Foldernamen bekommt.

    Danke
    Bernd
    Sorry, ich hab's heut nicht so mit sinnvollen Sätzen :D

    @RodfromGermany:
    die "Grütze" bei deinem Beispiel kommt daher, dass du 'line.first' verwendest. Line ist ein String, und das erste Element diese Strings ist das erste Zeichen ("*").

    @Topic
    'First' ist eine Extension. Das heißt, der erste Parameter, der dort angegeben werden muß, ist das Element, auf den diese Extension angewendet wird. Die Function bezieht sich auf das Element, auf das "First" angewendet wird.

    noch 'n Beispiel

    VB.NET-Quellcode

    1. Monate.AddRange({"Januar", "Februar", "März", "April",
    2. "Mai", "Juni", "Juli", "August",
    3. "September", "Oktober", "November", "Dezember"})
    4. Dim ErsterMonatMit4Buchstaben = _
    5. Monate.First(Function(honk)
    6. If honk.Length = 4 Then
    7. Return True
    8. Else
    9. Return False
    10. End If
    11. End Function)
    12. 'Kurzfassung:
    13. 'Dim ErsterMonatMit4Buchstaben = Monate.First(Function(asdf) asdf.Length = 4)
    14. 'Analog dazu:
    15. Dim ErsterMonatOhneR = Monate.First(Function(qwe) Not qwe.ToLower.Contains("r"))
    16. MessageBox.Show(ErsterMonatMit4Buchstaben)


    @Bernd: bei deinem Beispiel

    Quellcode

    1. Dim fileName As String = fileNames.FindLast(Function(r) line.EndsWith(r))
    erhält filename den letzten Wert, bei dem Line mit dem aktuell behandelten Wert aus der filenames-Auflistung endet.
    Da du sowohl bei Line als auch bei der fileNames-Auflistung komplette Zeilen (die mit dem Sternchen, den Zahlen und dem Dateinamen) hast, wird dir bei .First und bei .Last der Wert zurückgegeben, der identisch mit line ist. Und dieses Ergebnis dürfte wohl immer gleich sein.

    Da ich heute ohne Aspirin nicht funktioniere, empfehle ich die weniger verwirrende Variante:

    VB.NET-Quellcode

    1. Dim LINQWhatever = (From m In Monate
    2. Where m.Contains(Date.Now.ToString("MMMM"))
    3. Select m).Last
    4. MessageBox.Show(LINQWhatever)

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

    der_Kurt schrieb:

    Da ich heute ohne Aspirin nicht funktioniere,

    Tut mir leid.

    Ok, ich erkenne das dies ein Riesen Thema ist mit dem man sich ausgiebig beschäftigen sollte.
    Also keine schnelle Nummer. -> Kurzform -> quicky

    Ich habe das auf eine Altmodische weise gelöst.
    Über Index(Of) war mir zu kriminell. Das die Leerzeichen zwischendrin unterschiedlich lang sind.
    Auch könnte ein DateiName oder FolderName leerzeichen beinhalten. Also x Varianten.......

    Einfacher ist es für mich gewesen, Erstmal die Spalten wieder herzustellen.
    Nun kann ich Spaltenweise das Zeug weiterbearbeiten.
    Das Ergebnis, bisher ohne Fehler

    VB.NET-Quellcode

    1. Dim Liste() As String = Split(TreeView1.SelectedNode.Tag.ToString, " ")
    2. Dim Eintrag As String = ""
    3. For Each line As String In Liste
    4. If Not line Is String.Empty Then
    5. Eintrag &= line & "#"
    6. End If
    7. Next
    8. Dim s() As String = Split(Eintrag, "#")
    9. If s(7).Contains(":") Then
    10. ListBox1.Items.Add(s(4) & " " & s(6) & "." & s(5) & " " & s(7))
    11. Else
    12. ListBox1.Items.Add(s(4) & " " & s(6) & "." & s(5) & "." & s(7))
    13. End If


    @Kurth
    aufgehoben ist nicht aufgeschoben. Ich werde mir in einer ruihgen Minute mal deine Variationen ansehen.
    wo finde ich was dazu ?
    Linq, klar
    und das erste Beispiel ?

    Danke
    Bernd

    Bernd schrieb:

    Über Index(Of) war mir zu kriminell.

    Wie wäre es mit LastIndesOf()?
    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!
    Achte mal auf die verschiedenen Variationen


    drwxr-xr-x 2 w00da039 w00da039 4096 Dec 10 10:06 Downloads ' zweite Block ist einstellig, davor 3 leerzeichen
    drwxr-xr-x 3 w00da039 w00da039 4096 Dec 23 09:13 Test Elmar ' leerstelle zwischen VerzeichnisName
    drwxr-xr-x 12 w00da039 w00da039 4096 Feb 13 2011 forum ' zweite Block ist Zweistellig, davor nur 2 Leerzeichen
    drwxr-xr-x 5 w00da039 w00da039 4096 Jul 14 13:29 image
    drwxr-xr-x 2 w00da039 w00da039 4096 Mar 7 2011 index_files
    drwx------ 3 w00da039 w00da039 16384 Dec 24 01:09 logs ' Datum und Uhrzeit gemischt
    drwxr-xr-x 2 w00da039 w00da039 4096 Dec 24 01:08 usage
    -rw-r--r-- 1 w00da039 w00da039 4328 Mar 12 2011 Anmeldung_Kurs.php
    -rw-r--r-- 1 w00da039 w00da039 5359 Mar 12 2011 Dehnen_Alt.php
    -rw-r--r-- 1 w00da039 w00da039 5252 Mar 12 2011 Dehnen_Neu.php
    -rw-r--r-- 1 w00da039 w00da039 20646 Jul 14 10:59 Gruppe-BodyWorkOut.php
    -rw-r--r-- 1 w00da039 w00da039 20442 Jun 8 2011 Gruppe-BoryWorkOut.php
    -rw-r--r-- 1 w00da039 w00da039 6548 Jul 14 10:58 Gruppe-Karnevals_Tanzen.php
    -rw-r--r-- 1 w00da039 w00da039 7636 Jul 14 11:00 Gruppe-Kinder_SV.php
    -rw-r--r-- 1 w00da039 w00da039 9118 Jul 14 11:01 Gruppe-Kinderturnen.php

    usw.
    Das warne noch nicht alle Möglichkeiten.
    Am Ende hätte ich x Möglichkeiten und somit auch x Funktionen zum Filtern nötig.
    Da fand ich, unterm Strich, meine Variante dann doch kürzer.

    Danke
    Bernd
    Meine Wissensquellen sind zwei dicke VB-Wälzer, dieses Forum, MSDN und VS. Mehr nutze ich auch nicht.
    Das knifflige bei dem Beispiel war die Verknüpfung von Inline-Functions und Extension Methods. Erstere hat keinen Namen, und letzteres nutzt als ersten Parameter das Objekt, auf das es angewandt wird.
    Versuche mal den Suchbegriff "Anonyme Methoden". Ich kann dir hier keinen speziellen Link präsentieren, da die Ergebnisse nicht besonders spezifisch sind, sondern überall nur Code-Klumpen präsentiert werden.

    PS:
    "der_Kurt".Contains("h") = False ;)