Helpermethode für String.Concat

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von nikeee13.

    Helpermethode für String.Concat

    Hallo.

    Weiss jemand, wie ich String.Concat überladen kann?

    Ich hab ein Programm und möchte nicht immer String.Concat schreiben, um Strings zu verknüpfen.

    Wie kann ich String.Concat überladen/verkürzen?
    Kurz: Nein.
    Lang: Nein, man kann Methoden nur überladen, wenn man der Klasse, in der die Methode deklariert ist, die Überladung hinzufügt (was nicht geht, denn die String-Klasse ist eine Framework-Klasse).
    Ausführlich: Es macht keinen Sinn, String.Concat zu überladen. Für triviale Stringverknüpfung verwendet man den &-Operator. Die String.Concat-Methode ist für das direkte Verknüpfen einer Liste von Strings sinnvoll. Für nicht-triviale Sachen verwende String.Format.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Artentus schrieb:

    Welche Funktionalität fehlt denn deiner Meinung nach in der Concat-Funktion?
    Sie nimmt bereits beliebig viele Argumente sowie jegliche Arten von Auflistungen entgegen.



    Es geht nicht darum, sie zu erweitern. Mein Vorhaben ist, weniger Schreibarbeit dadurch zu haben.

    Anstatt String.Concat wäre es cool, wenn ich nur Cnc(Arg1, Arg2, Arg3) schreiben müsste..
    Verschoben. Das hat nichts im OffTopic-Bereich zu suchen.

    Zum Thema: Du musst einfach nur eine entsprechende Funktion schreiben, wo ist das Problem? Das solltest Du doch mittlerweile eigentlich können...

    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 :!:
    Siehe Niko Ortners Lösung, der Stringverknüpfungsoperator ist nicht umsonst da.
    Eine solche Funktion im VB6-Style widerspricht vollkommen den Guidelines, auf denen das Framework basiert, alleine deshalb wirst du sowas nicht finden. Und ich kann auch nicht empfehlen, es selber "nachzurüsten".
    Das kommt dazu. Zumal der Aufwand hundert mal größer ist, als wenn Du einfach String.Concat aufrufst oder den String anderweitig verbindest.
    Und schön sieht sowas auch nicht aus. ;)

    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 :!:
    Concat verkettet die übergebene Liste an Strings direkt hintereinander, Join fügt zwischen alle Elemente noch einen angegebenen String an, z.B. nützlich wenn man mehrere Strings mit Kommata oder Zeilenumbrüchen getrennt ausgeben möchte.
    Okay. Verstehe. Also wäre String.Join sinnvoll, wenn ich immer ein Zeilenumbruch nach meinem String haben möchte und .Concat an dieser Stelle nicht, weil ich jedesmal nach dem String meinen Zeilenumbruch einfügen müsste..? Okay, habe verstanden.
    Danke :thumbsup:
    Option Strict On!

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

    2 Saublöde ideen:
    1. Schreibe eine Extension für die string Klasse, in der es die Funktion Cnc gibt, die nach deinen Wünschen concateniert.
    2. zumindest in C# kann man mit einer Using anweisung einer Klasse einen anderen namen geben:

    C#-Quellcode

    1. using FL = ConsoleApplication.FileLogger
    2. namespace ConsoleApplication
    3. {
    4. class Program
    5. {
    6. static void Main(string[] args)
    7. {
    8. FL.Log("this works");
    9. }
    10. }
    11. }

    so könnte man dann solches Verwirklichen:

    C#-Quellcode

    1. str.Cnc()

    oder gar:

    C#-Quellcode

    1. s.c()

    Aber wie schon gesagt, sowas sollte man lieber sein lassen...

    Wer nicht viel tippen will, sollte sich den Umgang mit der Tab-Taste angewöhnen:
    str->Tab->.con->Tab->( und schon kann man in die Klammern schreiben was man will.
    ich hab so eine Extension, benutze ich sehr oft, weil ich statische Methoden umständlich finde:

    VB.NET-Quellcode

    1. '''<summary> verkettet alles</summary>
    2. <Extension()> _
    3. Public Function [And](ByVal Subj As String, ByVal ParamArray others() As Object) As String
    4. Return String.Concat(Subj, String.Concat(others))
    5. End Function
    6. 'Anwendungbeispiel:
    7. Imports Microsoft.Visualbasic.ControlChars
    8. '...
    9. Messagebox.Show("Hallo Leute!".And(LF, "Heute ist der ", Date.Today.Tostring("d"), ".", LF, "Wetter gut?", LF, "Nadenn - wegtreten, wer's noch nicht ist!"))

    @ErfinderDesRades Was ein Schrott. Sorry.
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Machs besser :D

    Erzeuge du dieselbe Messagebox ohne Sorry-Schrott.

    Edit: Eiglich bin ich recht verärgert - Diffamierungen ohne inhaltliche Begründungen - jämmerlich findich sowas. :cursing:

    Also nix gegen Kritik - bin ich sehr für. Aber Kritik ohne Begründung - sollte man eiglich zur Löschung melden sowas (aber jetzt habich schon drauf geantwortet).

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

    Deine Extension bildet das Verhältnis zwischen den einzelnen Objekten falsch ab. Es ist nämlich nicht das erste String-Objekt, das etwas mit den restlichen Argumenten macht, stattdessen wird auf allen String-Objekten inklusive des ersten eine gemeinsame Operation durchgeführt.
    Ein Zusammenfügen von mehreren Strings ist sinngemäß keine Operation irgend eines dieser Strings und hat deswegen keine Objektmethode zu sein. Objektmethoden (und auch Extensions, die wie Objektmethoden verwendet werden), werden als Operationen entweder durch das Objekt auf die Argumente oder auf das Objekt durch die Argumente verstanden, niemals jedoch als Operationen an einem außenstehenden Objekt durch sowohl das Objekt alsauch die Argumente.

    Und sorry für die maximal verwirrende Ausdrucksweise.
    Verzeih mir.

    C#-Quellcode

    1. MessageBox.Show(String.Format("Hallo Leute!{0}Heute ist der {1}.{0}Wetter gut?{0}Nadenn - wegtreten, wer's noch nicht ist!", Environment.NewLine, DateTime.Now.Day.ToString()));

    Unwesentlich länger, trotzdem wesentlich leserlicher, kein VisualBasic-Namespace. Plus was Artentus sagte.
    Übrigens: Nutze ich deine Variablen, also ​LF und ​Date.Today.ToString(), dann ist meine Variante sogar kürzer.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    @Artentus: jo, das ist ein architektonischer Gesichtspunkt, den ich verstehen kann.

    Aber da setze ich mich einfach drüber weg, weil ich find das so praktisch, es schreibt sich schnell, ist gut veränderlich (das ist bei String.Format ja immer sone Sache) und kurz.
    Und es ist nicht unleserlicher als anderes - wie gesagt: Wenn wir drüber reden wollen, dann am liebsten anhand von Gegenbeispielen, dass man praktisch vergleichen kann.

    @Nikx: ok.
    Jo, das ist die String.Format-Alternative, und die findich immer lästig, wenn man da die Reihenfolge der Argumente ändert, was einfügt oder so, dann muss man da immer lausig mit den Platzhaltern aufpassen, nachbessern.
    Dann schon lieber String.Concat, da schreibt man alles so hinternander weg, wie's rauskommen soll.

    Also hätten wir 3 Alternativen - ach 4, nehmen wir olle & noch dazu:

    VB.NET-Quellcode

    1. MessageBox.Show("Hallo Leute!".And(Lf, "Heute ist der ", Date.Today.ToString("d"), ".", Lf, "Wetter gut?", Lf, "Nadenn - wegtreten, wer's noch nicht ist!"))
    2. MessageBox.Show(String.Format("Hallo Leute!{0}Heute ist der {1}.{0}Wetter gut?{0}Nadenn - wegtreten, wer's noch nicht ist!", Environment.NewLine, DateTime.Now.Day.ToString()))
    3. MessageBox.Show(String.Concat("Hallo Leute!", Lf, "Heute ist der ", Date.Today.ToString("d"), ".", Lf, "Wetter gut?", Lf, "Nadenn - wegtreten, wer's noch nicht ist!"))
    4. MessageBox.Show("Hallo Leute!" & Lf & "Heute ist der " & Date.Today.ToString("d") & "." & Lf & "Wetter gut?" & Lf & "Nadenn - wegtreten, wer's noch nicht ist!")


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

    Bitte liefere mir doch ein Beispiel für das "gut veränderlich". Ich habe bei String.Format ein einfach erweiterbares System, kann den String als Ganzes lesen und brauche keine 100 Kommas,
    um meinen String zusammenzubauen. Ich kann so gesagt frei darin herumschreiben, wie ich grade möchte. Bei dir ist das etwas schwieriger.

    Grüße
    "Life isn't about winning the race. Life is about finishing the race and how many people we can help finish the race." ~Marc Mero

    Nun bin ich also auch soweit: Keine VB-Fragen per PM! Es gibt hier ein Forum, verdammt!
    Naja, sowas:

    VB.NET-Quellcode

    1. MessageBox.Show("Hallo Leute!".And(Lf, "Gestern war der ", Date.Today.AddDays(-1).ToString("d"), ".", Lf, "Heute ist der ", Date.Today.ToString("d"), "."))
    Neue Argumente eingefügt, andere Argumente gelöscht.
    Das geht mit Copy & Paste und Delete.
    Der Unterschied ist halt, dass man nur die Argumente selbst anfassen muss, nicht noch zusätzliche Platzhalter.

    Aber ich will da auch kein Glaubenskrieg von machen, ich halte das eher für Geschmacksache.

    Edit: Aber ich hab noch mehr so String-Helpers:

    VB.NET-Quellcode

    1. MessageBox.Show(Lf.Between("Hallo Leute!", "Heute ist der {:d}.".FormatX(Date.Today), "Wetter gut?", "Nadenn - wegtreten, wer's noch nicht ist!"))
    Extensions und mehr. (obwohl - FormatX habich nochmal geändert).

    Die beiden sind jetzt glaub auch architektonisch vertretbar ;)

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