LINQ statt For Schleife

  • VB.NET
  • .NET (FX) 3.0–3.5

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

    LINQ statt For Schleife

    Abend, stehe grade irgendwie auf dem Schlauch. Undzwar, ich habe folgende For Schleife:

    VB.NET-Quellcode

    1. For i As Integer = 0 To strVar.Split(CChar(vbCrLf)).Count - 1
    2. If strVar.Split(CChar(vbCrLf))(i) = "some value" Then
    3. Return i
    4. End If
    5. Next


    Diese möchte ich nun aber durch eine LINQ Abfrage ersetzen. Habe es so probiert:

    VB.NET-Quellcode

    1. Dim xx As String = (From x As String In strVar.Split(CChar(vbCrLf)).ToArray() Where x = "some value" Select x).FirstOrDefault


    Das Problem ist nun jedoch, dass ich dann das jeweilige Ergebnis bekomme für xx. In dem Fall "some value". Stattdessen brauche ich aber die Anzahl der Durchläufe, bis "some value" gefunden wurde (quasi item index).
    Wie stelle ich dies an?
    Moin,

    warum denn krampfhaft LINQ? Das macht dann keinen Sinn, wenn es nicht hilft, sondern eher mehr Probleme bereitet. ;)
    Deine Schleife selbst ist aber schon recht unschön, warum kein For Each? Da kannst Du dann eine Integer-Variable inkrementieren und wenn der String der gesuchte ist, verlässt Du die Schleife einfach (​Exit For).

    Sieht besser aus, splittet nicht unnötig zwei Mal und kommt auf das raus, was Du willst.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ich kenn mich mit LINQ nicht direkt aus, sondern nur mit den IEnumerable-Extensions.
    Ich würde es (wenns wirklich notwendig ist, wie Trade sagte), dann so lösen:
    ​varxx = strVar.Split((char)10).TakeWhile(x => x != "some value").Count()
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    ich hab mir eine Extension dafür geschrieben:

    VB.NET-Quellcode

    1. <Extension()> _
    2. Public Function FindIndex(Of T)(items As IList(Of T), predicate As Func(Of T, Boolean), Optional start As Integer = 0) As Integer
    3. For FindIndex = start To items.Count - 1
    4. If predicate(items(FindIndex)) Then Exit Function
    5. Next
    6. Return -1
    7. End Function

    Aufruf:

    VB.NET-Quellcode

    1. dim Index = strVar.Split(LF).Findindex(Function(s)s="some value")


    ach - brauch man in diesem Falle ja nichtmal:

    VB.NET-Quellcode

    1. dim Index = Array.IndexOf( strVar.Split(LF), "some value")

    strVar.Split(CChar(vbCrLf))

    Das macht nicht, was Du willst!
    vbCrLf (mal abgesehen vom importierten Microsoft.VisualBasic-Namespace *hust*) ist 2 Zeichen lang. CChar davon nimmt nur das erste dieser Zeichen, also das CarriageReturn. Wenn Dein String wirklich CrLf-Zeilenumbrüche beinhaltet, dann enthalten alle Elemente außer dem ersten am Anfang nochmal das LineFeed-Zeichen.
    Was Du suchst ist das:

    VB.NET-Quellcode

    1. strVar.Split({vbCrLf}, StringSplitOptions.None)
    Die Überladung der Split-Funktion nimmt ein Array von Strings entgegen, an denen gesplittet wird. Mit StringSplitOptions kann man noch angeben, ob leere Elemente auch zurückgegeben werden.

    Bezüglich vbCrLf:
    Wenn Du diese Sonderzeichen brauchst, verwende Microsoft.VisualBasic.ControlChars.XYZ. Die haben die richtige Typisierung (ControlChars.Tab ist ein Char, vbTab jedoch unnötigerweise ein String).
    Und wenn Du einen Zeilenumbruch brauchst, ist es fast immer ratsam, Environment.NewLine zu verwenden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    jou.
    und Microsoft.Visualbasic-Namespace-Progger proggen meist auch noch mit Option Strict Off, das ist eine noch schlimmere Voreinstellung.

    Also das Gesamtpaket, was an Voreinstellungen zu tätigen ist, bevor Vb.Net überhaupt eine brauchbare OOP-Sprache wird: Visual Studio - Empfohlene Einstellungen

    Da ist auch auf eine feine Lösung mit ControlChars verlinkt, weil die kann man nämlich general-importen, und dann wird der Code so schnucklig wie in post#4, Listing#3.