Frage zu LINQ

  • VB.NET

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

    Frage zu LINQ

    Hallo, ich spiel da grad mit folgendem rum...

    VB.NET-Quellcode

    1. Dim dbl As Double
    2. TextBox4.Text = (From txt In {TextBox3.Text, TextBox4.Text} _
    3. Where Double.TryParse(txt, dbl) _
    4. Select CDbl(txt)).ToArray.Sum.ToString

    Wie komm ich um die Zusatzvariable dbl drum herum? oder falscher Ansatz?
    Probier es mal so:

    VB.NET-Quellcode

    1. TextBox4.Text = (From txt In {TextBox3.Text, TextBox4.Text} _
    2. Where IsNumeric(txt) _
    3. Select CDbl(txt)).ToArray.Sum.ToString
    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 täte IsNumeric zu die böse Funktionen zählen.
    Double.TryParse ist präziser, und testet nicht nur, sondern erzielt im Erfolgsfall auch gleich Ergebnis.

    VB.NET-Quellcode

    1. Dim dbl As Double
    2. TextBox4.Text = (From txt In {TextBox3.Text, TextBox4.Text} _
    3. Where Double.TryParse(txt, dbl) _
    4. Select dbl).Sum.ToString

    ungetestet

    Ooh - geht nich :(

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

    @ErfinderDesRades:
    Kann es sein, dass Du den Eröffnungspost nicht gelesen hast :?:
    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!
    @ErfinderDesRades
    Das klappt so herum nich... das select muss sich wohl auf txt beziehen...
    Mir ging es auch eher darum, dass ich für einen Einzeiler nicht doch wieder ne extra Zeile aufmachen muss.
    btw.. IsNumeric feht in der Liste von SeriTools ;)
    @Rod: doch, aber hast du meinen Post gelesen?

    Ich wende ein, dass IsNumeric eine böse Funktion ist, die erzwingt, dass der String zweimal analysiert wird, während prinzipiell möglich ist, mit nur einer Operation auszukommen.

    Das Problem ist interessant, denn es scheint, dasses mit Linq nicht so geht, wie ich mir das vorstelle.
    Meine Tests, was geht und was nicht:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim dbl As Double
    3. Private Sub TestToolStripMenuItem_Click(ByVal sender As Object, ByVal e As EventArgs) Handles TestToolStripMenuItem.Click
    4. TextBox3.Text = SumTexts({TextBox1.Text, TextBox2.Text}).ToString 'korrekt
    5. TextBox3.Text = SumTexts3({TextBox1.Text, TextBox2.Text}).ToString
    6. End Sub
    7. Private Function SumTexts(ByVal txts As String()) As Double
    8. 'korrekt, aber inakzeptabel wg. eiglich unnötige Klassenvariable
    9. Return (From txt In txts Where Double.TryParse(txt, dbl) Select dbl).Sum
    10. End Function
    11. Private Function SumTexts2(ByVal txts As String()) As Double
    12. Dim dbl As Double
    13. Return (From txt In txts Where Double.TryParse(txt, dbl) Select dbl).Sum 'Sytax-Fehler
    14. End Function
    15. Private Function SumTexts3(ByVal txts As String()) As Double
    16. 'falsches Ergebnis
    17. Return (From txt In txts Let dbl = New Double Where Double.TryParse(txt, dbl) Select dbl).Sum
    18. End Function
    19. End Class

    Bei SumTexts2() scheint mir ein Compiler-Bug vorzuliegen, denn nach meinem Verständnis müsste die Syntax korrekt sein, und ebenso funktionieren wie in SumTexts()

    FloFuchs schrieb:

    btw.. IsNumeric feht in der Liste von SeriTools ;)
    werdich ihm gleich stecken ;)

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

    hmm ok... Function SumTexts funktioniert auch nur wenn es eine KLassenvariable ist? Bei lokaler definition gibts auch einen Fehler.
    und Deinen SyntaxFehler hatte ich vorhin auch schon... dachte es geht einfach so nich, obwohl ich mich gewundert habe.
    Bilder
    • Fehler.jpg

      50,67 kB, 986×123, 96 mal angesehen
    Diesen Fehler hatte ich auch. Ich hatte an eine Befehlserwweiterung gedacht, bin da auch nicht froh geworden.
    Hab ne kleine Funktion danebengeschrieben:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. TextBox4.Text = (From txt In {TextBox3.Text, TextBox4.Text} _
    3. Where MyTryParse(txt) _
    4. Select CDbl(txt)).ToArray.Sum.ToString
    5. End Sub
    6. Private Shared Function MyTryParse(txt As String) As Boolean
    7. Dim dbl As Double
    8. Return Double.TryParse(txt, dbl)
    9. End Function
    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!

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

    Das ist echt näckisch, leider hab ich von LINQ nicht genug Ahnung.
    Jedenfalls kommt bei

    VB.NET-Quellcode

    1. Private Function SumTexts2(ByVal txts As String()) As Double
    2. Dim dbl As Double
    3. Return (From txt In txts Where Double.TryParse(txt, dbl) Select dbl).Sum 'Sytax-Fehler
    4. End Function
    der Fehler
    Die Bereichsvariable "dbl" verbirgt eine Variable in einem einschließenden Block oder eine zuvor im Abfrageausdruck definierte Bereichsvariable.
    in der C#-Version

    Quellcode

    1. private double SumTexts2(string[] txts)
    2. {
    3. double dbl = 0;
    4. return (from txt in txts where double.TryParse(txt, out dbl)dbl).Sum;
    5. //Sytax-Fehler
    6. }
    kommt
    Der Typ des Ausdrucks in der select-Klausel ist falsch. Fehler beim Typrückschluss im Aufruf von "Select".
    und noch etwas mehr.
    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!
    doch - c# kann das:

    Quellcode

    1. public partial class Form1 : Form {
    2. public Form1() {
    3. InitializeComponent();
    4. string[] strings = { "22,3", "21,3" };
    5. var result = SumTexts2(strings);
    6. }
    7. private double SumTexts2(string[] txts) {
    8. double dbl = 0;
    9. return (from txt in txts where double.TryParse(txt, out dbl) select dbl).Sum();
    10. }
    11. }
    Die MS-Lumpen! :cursing:
    Siehe mein Post#9, mach Dir eine separate Function. :thumbsup:
    @EDR: Ähnliches hatte ich schon mal mit Befehlserweiterung.
    Noch ein Grund, auf C# umzusteigen. :D
    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!