String in gleiche Teile teilen und String inhalt swapen

    • C#

    Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

      String in gleiche Teile teilen und String inhalt swapen

      Hallo,

      wieder mal Extensions.

      Die Erste Extension teilt einen String in gleich große Teile und gibt diese als Liste zurück

      C#-Quellcode

      1. /// <summary>
      2. /// Teilt einen String in definierte Teile
      3. /// </summary>
      4. /// <param name="s">String der geteilt werden soll</param>
      5. /// <param name="length">Länge der jeweiligen Teilstücke</param>
      6. /// <returns>Liste von Teilstrings</Returns>
      7. public static IEnumerable<string> String2Parts(this string s, int length)
      8. {
      9. if (s == null)
      10. {
      11. throw new ArgumentNullException("s");
      12. }
      13. if (length <= 0)
      14. {
      15. throw new ArgumentException("Die Länge der Teile kann nicht kleiner Null sein.");
      16. }
      17. for (var i = 0; i < s.Length; i += length)
      18. {
      19. yield return s.Substring(i, Math.Min(length, s.Length - i));
      20. }
      21. }


      Die zweite Extension Spiegelt den Inhalt eines Strings

      C#-Quellcode

      1. /// <summary>
      2. /// Dreht einen beliebigen String
      3. /// </summary>
      4. /// <param name="s">String der gedreht werden soll</param>
      5. /// <returns>Gedrehter String</Returns>
      6. public static string SwapCharacters(this string s)
      7. {
      8. if (s == null)
      9. {
      10. throw new ArgumentNullException("s");
      11. }
      12. StringBuilder sb = new StringBuilder();
      13. for (int i = s.Length - 1; i >= 0; i-- )
      14. {
      15. sb.Append(s.Substring(i, 1));
      16. }
      17. return sb.ToString();
      18. }


      Der Aufruf beider Funktionen kann z.B. wie folgt erfolgen

      C#-Quellcode

      1. StringBuilder sb = new StringBuilder();
      2. IEnumerable<string> ret = this.Value.String2Parts(8);
      3. foreach (string s in ret)
      4. {
      5. sb.Append(s.Replace("2","x").SwapCharacters());
      6. sb.Append(" ");
      7. }
      8. return sb.ToString();


      Gruss

      mikeb69
      Hi
      ich würde empfehlen, statt s.Substring(i, 1) auf s[i] zurückzugreifen. Substring ist relativ teuer und sollte man eher vermeiden, wenn man eigentlich ggf. auch auf Chars operieren könnte.
      Statt new ArgumentNullException("s") könntest du übrigens noch auf nameof(s) statt "s" zurückgreifen, wobei ich es schon gut finde, dass du die Fehler abfrägst. Das bringt beim Umbenennen von s weniger Schwierigkeiten.

      Viele Grüße
      ~blaze~
      zu SwapCharacters
      Warum nicht einfach:

      C#-Quellcode

      1. var s = "Hallo";
      2. var r = new string(s.Reverse().ToArray());

      Bzw von der Performance besser:

      C#-Quellcode

      1. var r3 = new StringBuilder().Append(s.Reverse()).ToString();


      ?

      lg
      ScheduleLib 0.0.1.0
      Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

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

      mikeb69 schrieb:

      C#-Quellcode

      1. if (s == null)
      würde ich mit string.IsNullOrEmpty(s) testen, ein Leerstring knallt da nicht, ist aber auch nicht sinnvoll zu verarbeiten.
      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 würde grundsätzlich niemals Exceptions bei gültigen Eingaben werfen. Das Verhalten produziert mehr Ärger und Fehler, als es behebt. Es produziert mindestens eine zusätzliche If-Abfrage und frustriert Anwender, die genau diesen Sonderfall haben. Man stelle sich vor, man verwendet eine TextBox und bei ein Leerstring soll ebenfalls eine gültige Eingabe sein.

      Ebenso würde ich niemals eine ArgumentNullException werfen, wenn das Argument nicht Nothing/null ist. Ein Leerstring ist nunmal nicht Nothing/null.

      Viele Grüße
      ~blaze~
      @~blaze~ Ich hab mal folgenden Test gemacht, das sollte hier äquivalent realisiert werden:
      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!
      Kann in einer Extension der Parameter für das zu erweiternde Objekt denn überhaupt null/nothing sein?
      Würde da nicht zuvor schon beim Versuch von dem Objekt eine Methode aufzurufen eine ObjectNullReferenceException fliegen?

      Edit:
      @RodFromGermany zu dem Zeitpunkt, als ich das gefragt habe, war dein Beitrag wohl noch nicht freigegeben.

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

      EaranMaleasi schrieb:

      Kann in einer Extension...
      Siehst Du doch an meinem ersten Beispiel:

      C#-Quellcode

      1. string txt = null;
      2. string[] parts = txt.Split(' ');
      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!
      Wie gesagt, "" != null. Ergo sollte man bei null eine ArgumentNullException werfen, sonst nicht. string.Empty ist in diesem Fall ein gültiger Wert, null nicht.

      Extensions können auch auf null ausgeführt werden. Man sollte zur null-Abfrage außerdem eine ArgumentNullException werfen und keine NullReferenceException.
      Dafür gibt es mehrere Gründe:
      - die NullReferenceException dient dem .Net zugrundeliegenden System dazu, dem Benutzer mitzuteilen dass er etwas falsch gemacht hat, d.h. sie sollte idR. nicht vom Benutzer geworfen werden
      - die Methode muss nicht als Extension aufgerufen werden, sondern kann auch direkt auf der statischen Klasse aufgerufen werden (z.B. System.Linq.Enumerable.Select(...))

      Viele Grüße
      ~blaze~